Úvod EIC&ESB-Globální IT Řešení na míru

EasyITcenter & EasySYSTEMbuiler - Globální Řešení vašeho IT Obecné Informace o Struktuře, vazbách a možnostech tohoto Unikátního Globálnho Řešení Celé oblasti IT až na malinké vyjímky.

Zde budu průběžně zapisovat nápady

Rozcestník IT Universální Řešení EIC & ESB

Celé IT v Jednom Řešení pro Váš Bussines, Firmu,


ESB - SYSTEM DESIGNER - TOUCH SYSTEMS - WEB

Generátor - WebKonfigurátor - Vytvoření LIGHT Klonu

PředObjednávky NA EasySYSTEMbuilder LIGHT za POUHÝCH 10000KČ
Dodání Do 1 Měsíce.

Chystá se Nový LIGHT KLON EasySYSTEMbuilderu
pro účely:

  • Samostatný ANY SYSTEM Designer/APP

  • Dotykové TouchPaNely

  • Provoz Dynamického WebServeru

  • Řeší Vytváření Systémů: WebView v App

  • Řeší Vytváření Webů

  • Řeší Vytváření TouchPanelů

  • Z ESB udělat Light Klienta pro TOTO Řešení

Logika:

  • Vytvořit Tabulku Webové Objekty
    info URL
    seznam ostatních objektu v pořadí
    Jak se pospojují do výsledné Stránky

1 Tabulka na celé řešení:

  • ID AutoIncrement
  • Primární Ano/Ne = Startovací Stránka
    bude zobrazena na dotykovém panelu
  • ServerUrl Adresa kde se spustí
    je nepovinná pro ID co jsou jen Objekty
  • Požadována Autentifikace ROLE - Ano/Anonymous
    Když Ano - Přesměrovat+Kam nebo Přeskočit
  • Html Content (HTML,JS,CSS) - každá část má své potřebné
  • Seznam ID následných: umožňuje dynamickou naváznost
  • Aktivní
  • UserId
  • Timestamp

Web Zázemí: Interní Web Server Systému

  • Metro4
  • 1000+ k Dispozici Knihovny Statických Nástrojů
  • JQuery
  • SQLite DB s Editorem
  • AutoTranslator

Prvni musí být Matice Web Stránky, Ostatní Objekty se
dohrají JQuery objekt.html('')

Vytvořit Zobrazení Schematu Provedení


udelat agendu generatory - tim myslim vygenerovat galerii, dokumentaci atd na ceste v administraci


LOW/NO/FULL code EXTREMELY EASY TO DEVELOP ANY SYSTEM

For thinking, the development of tools and work with them worthy in the 21st century

The development of FRONTEND as an entire IS system as you do not know it - only 3 choices are enough

 Logic - everything in the database is a LIST (list of invoices)    

-> This may or may not have a DETAIL (list of items)
|| OR it needs to be just settings, i.e. Detail (program settings, video processing, etc.)

And the result can be a system that SAP or anyone else can only dream of.
Almost like tennis, you can publish one table after another, and by evening you have a small system.

DEFINITION OF 3 layer SYSTEM and necessary components

Database - place for DATA
Backend Server - A service that securely conveys data to applications
Frontend/User Application - A nice application to easily work with data
Print support - creation and printing of any reports

START in 1 day you will start your new system in three steps


Development in Golden UNIVERS RESTFULL/SOCKET BACKEND SERVER in three user steps

  • Create any database Table. Use the TemplateList Template
    and just insert your boxes into it. Remember Indexes, Foreign Keys, or look at already existing tables or consult with me. It IS for a few minutes

  • You export the tables as a model using the prepared CMD command to the BACKEND project
    [ EntityFramework 6 ] command: Scaffold-DbContext "Server=IP;Database=DB;User ID=USER;Password=PW;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir DBModel
    done - the entire database is defined in the Backend server

  • From existing calls, e.g. UserList, copy and rename the new API call for the new table [GET,POST,PUT,PATCH,DELETE]
    COPY file -> PASTE file -> Rename to new API for example: /skladList and Build&Run
    Done, the API Server is WAITING at http://vaseip/skladList for your call and deployment at the client, in the company, anywhere


Development in EASYBuilder Modern WINDOWS XP+ thin application or system in three user steps

  • You copy the table definition from the model created in the BACKEND project to the FRONTEND project
    COPY Class from BE Model -> PASTE into FE application -> add new APIURL

  • Select the template you want, there are primarily 3 -> rename it, edit the form and connect it to the MAINMENU
    so you set the WHERE to search, COPY/PASTE boxes, write Translation in the dictionary and copy the connection to the MAINMENU
    done - the result is a new form with complete user control

  • Build&Run - you check the work one after the other, because typos are part of us, aren't they
    the full logging option slaps you in detail where the error is or HURRY GOES
    Done, the Application is WAITING for your work or deployment at the client, in the company, anywhere


evelopment of Press Reports in FYIREPORTING

  • You simply copy the existing DATALIST/DETAIL report and open it in the editor
    Rename to the new name of your table.

  • You edit your SQL SELECT and Test it, the parameters are already set ID/SEARCH/CONNECT
    Ideally in MSSQLMS or HEIDYSQL or something and debug it there. Remember everything is just a LIST or Detail.
    done - and you have the correct data that you just arrange for printing in the form.

  • And you import into the system in the REPORTING list menu, where you set the required link to APIURL/SEARCH/ID
    Done, the press kit is WAITING for your work or deployment at the client, in the company, anywhere

END OF KNOWLEDGE REQUIRED FOR SYSTEM DEVELOPMENT


Basic listing of almost unlimited skill application

  • Prepared with common agendas
  • Operation possible on WINDOWS XP, 7, 8, 10, 11
  • C# WFP, XAML, Drag&Drop technology
  • Complete management of any Agenda (Table) RESTORE/NEW/EDIT/COPY/DELETE
  • Automatically generated list data view.
  • Easy preparation of the form according to prepared templates and ready made agendas
  • more than 100 types of input fields
  • Search in content in the data list
  • also optimized for TOUCH TERMINALS for MANUFACTURING or BUSINESS, SELF*SERVICE environments
  • own printing system with direct printing support
  • Almost unlimited development possibilities with the possibility of own involvement
  • Support for controlling operating systems
  • thousands of already free tools on GitHub
  • connection to any third*party services
  • support for all known protocols EMAIL, IMAP, HTTPS, FTP, SSH, SMTP, TELNET
  • command line support, JavaScript, Telnet
  • Option to connect to 3*party systems, IS and OS systems
  • Support multimedia, hardware, 3D, devices, RFID readers, QR, BAR, EAN, VIDEO, SOUND, MS OFFICE, PDF, XPS, RTF, etc.
  • development of any customized system from 20,000 CZK. System already prepared as a template for any more than just IS SYSTEM
  • the possibility of creating any INFORMATION OR CONTROL, MONITORING, REPORTING system, and so on

EASYTOOLS IMPLEMENTED ADD-ONS

  • AddOns for touch panels, controls, data types, forms, media, documents, 3D,
  • They are completely free to download (including every license pack)
  • Open Source community to include more than 1000 tools in the system by community

BUILT SYSTEMS IN 14 DAYS

  1. LicenseSrv
    MultiOS license server with listening API GET/POST server / generation of unlimited static/dynamic CODES and management client
  2. GUIDES Windows XP+ Implementation Production Guides for Production Companies For office / touch panels with unlimited clients and printing options
  3. ShoPingER Windows XP+ MultiBranch Quotation/Order/Invoicing System with multimedia files supported by unlimited clients and printing capabilities
  4. LicenceShoper MultiOS License Server PLUS Windows XP+ MultiBranch Billing System [LicenseSrv + ShoPingER]

SOLUTION - WHERE TO FIND COMPLETE INFORMATION

All documentation, license, case study, price list, media, developer information, help, manuals, technology information, installation, images, videos, downloads, etc. can be found here or:


PROJECT IMPLEMENTATION CASE STUDY PROJECTS USING IDEAS

For thinking, the development of tools and work with them worthy in the 21st century

  • The first use of this solution was a big change in a manufacturing company For 1000 workers, but it was only four days work for the IT department
  • Implementation of production guides as a task for 4 days CZ In Case Studies
  • Creation of the Billing System as a replacement for the system with discontinued support.
  • Creation of the ShoPingER Invoicing System with a large overlap in 14 days]
  • All Windows Applications are available to try online in the Application ShowRoom https://KlikneteZde.Cz

Golden - Backend Server Development Plan

  • Create Backend Server Generator
  • Create Full Customer Support with Project Managements

EASYBuilder - WPF Fronted System Builder Development Plan

  • Publish XAML Generator Graphical Tool with Templates Support
  • implement Global Context menu for all DataLists with Count of API record request setting,
    Properties of Datalist, DataRequest,DataList Controller
  • Convert WPF System to WebApplication for Windows/Linux with all graphics and possibilities
  • Create SYSTEM Generator
  • Create Metro4 Full compatible WEB SYSTEM Variant
  • Implement FastReport Tool (Replace FYI Reporting)

Using References of Variables or Classes - Maximum Saving Memory Performance

  • For All processes which is modified by One Person in One Time - Typical System Using

In simple explanation and absolut ideally working with Data - Maximum Clean Code
Data flow modify one Variable or Class on Way Over More Sequenced Methods

  • From API List Logic You working only With Primary API Dataset and few sets of Dials
  • For standard Using its best way For Maximum clean code without Exeption

Is calculating that you Have Full or Extended Dataset for API everytime

  • Point For Data loading "'SetRecord' Method" - load data from model to Dataset Variable
  • Some Operations where you can change data values
  • Point For Recapitulate full Dataset and Save

EasyITcenter & EasySYSTEMbuilder VÝVOJOVÝ PLÁN

!!!Unikátní Investiční Příležitost, či Unikátní Globální IT Řešení pro VAŠI FIRMU!!!
9.1.2024 nasazeny Aktuální verze na Domácím PC na vesnici k vyzkoušení
CO BUDE FINÁLNÍ?

  • ONLINE GENERÁTOR MultiServeru + BackendAPI + Dynamic API
  • ONLINE GENERÁTOR MS SYSTÉMŮ DLE STRUKTURY DB
  • BUILDER PRO TOUCHPANELY, BUSINESS PANELY, ANY SYSTEM
  • WEB PORTAL s MULTI WEB SERVERS - cokoliv z GITU (React,Php,Electron,Vite,Gulp,..)
  • SUBDOMAIN WEBSITES - dá se říct skoro JEDNODOMÉNOVÝ HOSTING
  • MULTI IT SERVERS & SOLUTIONS, již nyní s velkým počtem Unikátních Funkcionalit

VÝHLED 2024

LÉTO 2024 -
ONLINE GENERÁTORY - API,MS FORM, WEBFORM(z DB json),
ONLINE Správa klientských Projektů,Build Projektů, Nasazení Změn, Refactor, Stažení Instalátorů


ZIMA 2024 - Průmysl - Implementace Siemens, TouchPanel Builder


Úvod EIC&ESB-Globální IT Řešení na míru

EasyITcenter & EasySYSTEMbuiler - Globální Řešení vašeho IT Obecné Informace o Struktuře, vazbách a možnostech tohoto Unikátního Globálnho Řešení Celé oblasti IT až na malinké vyjímky.

Historie Reklamních Sdělení za Rok 2023 - DOSUD

Hledám práci: IT vývojář webových/desktopových aplikací/systémů, s vlastními groupWare řešeními

multiplatforního Backend Serveru: http://kliknetezde.cz:5000 a
MS SYSTEM Generatoru https://kliknetezde.cz - do roka i ve WEB platformě Metro4

Zde naleznete Dokumentace, prezentace, screeny, videonávody atd k mým Future projektům:

  • Hledám partnera, sponzora, prodejce, marketéra - možnosti jsou až neuvěřitelné

Mé stránky mají Boostrap pro mobil - ale tolik stručných informací, že je zobrazujte na PC a ne mobilu
pro mobil: http://kliknetezde.cz:5000/server/Media/Presentation

hledám nové projekty, spolupráci či trvalý úvazek jediná podminka je remote.
Ovládám jak WEB/APP/PCL/PLC Siements/Administrace Linux / Windows, vývoj multiplatformních programů (1 projekt pro IOS,Adnrdoid,Windows)
Instalace Windows/Linux Serverů/Služeb (LDAP,MAIL,SAMBA,FTP,cokoliv), Implementace API, tvorba sítí,webů, aplikací, terminálů na míru.

Zkušenosti ze 17 zaměstnání jako samostatný Administrátor/IT/Vývojář/IS Specialista/ v nadnárodních korporacích např:
ISAN Blansko IT Admin/OS/IS/Fuze ,Teva Brno IT Admin/dev, Heunisch Brno Linux IT admin/dev, Acer Brno IT TeamLeader/Support/Dev/Admin/Team Lead,T-Mobile Dev Server/MultiplatformApp

Nyní praduji sám na sebe z domu, protože ve firmách mě nedokázali ohodnotit ani využít mé schopnosti - PRÝ PŘÍLIŠ AMBICIÓZNÍ
(s výsledky, tlačil sem vývoj firmy moc rychle)

Nabízím tedy své služby za hod cenu od 500Kč (spokojen budu se 750Kč 5000Kč/Hod by ale bylo úměrné znalostem v porovnání se stavem IT v ČR a ve světě)

  • aktuálně jsem klesl na 500, protože pracovat musím a nenacházím žádný zájem.
    Future technology je u mě vidět přímo na https://kliknetezde.cz - Windows Online například.

žádný JAZYK ani OS/IS mi není cízí (Kromě C++)
Oblíbené technologie mám ASPNET/CORE,WPF,WCF, NodeJs,Vue,MSSQL,MYSQL,WIN/LIN.

Nebráním se ani vícero malým support úukonům na dálku (umím pomoci s čímkoliv, dětat analýzy,
najít a aplikovat řešení vašeho problému z místa- Telefonického hovoru, RDP/VNC připojení, správu serverů, nastavení AZURE/GCLOUD/DOCKER/GITHUB/GITLAB/ atd..

Více info na mých stránkách https://Groupware-solution.eu - Menu "Co děláme"
Github: https://github.com/liborsvoboda uvolněno 57 projektů, převážně serverů a systémů - ideální pro středně velké podniky

beru i malé zakázky (téměř s okamžitým vyřešením), než si mě konečně někdo zaplatí a vymezí pouze pro sebe, fakturace hodinová dle domluvy
když se učím něco nového (technologie) - nefakturuji, beru jako osobní rozvoj

Svoboda Libor
IT Architekt/Analytik/Vývojář/Administrátor/Údržbář/Školitel/ srdcem i duší

Zavoláním na tel: 00 420 724 986 873 se můžete sami přesvědčit
Dostupnost 24/7, email: Libor.Svoboda@GroupWare-Solution.Eu
Jsem vyjímka na trhu a odpovídám vždy (pokud to není jak zde je zvykem jen tupá úrážka)

Je možný i sponzoring projektů a domluva na spoluvlastnictví připravovaných projektů
EASY-DATA-Center - Lin/Win Groupware Backend Server Online Generator (FullAPI,FTP,MD,WEB,DB,HealthCheck,AutoServices) + 100 technologií
EASY-SYSTEM-Builder - WIN ANY system builder brzy AUTO generator ze Snapshotu Backend serveru - Vygeneruje celý systém podle struktury API

v budoucnu chci mít vlastní tým pracující v mém duchu - COkoliv, spolehlivě, kvalitně, rychle = levně


Hlídání serveru přes webSocket, MultiEmail API - vlastní emailer, Licenční Server,

Centralizované Tabulky, Vzdálená Správa/Monitoring/Administrace/Vývoj Serveru

A to vše Zdarma právě nyní:

Pravé tlačítko a překlad do češtiny vám vše na webu odhalí :)

Už jste slyšeli o MultiServerech? Takzvané GroupWare řešení?
Já to pojal trochu obsáhleji a z Backernd Serveru se stal MultiServer
s Fukcemi: Automatizovaného vývoje BACKEND Serveru, DB Management,
FTP Server, Multi WEB Server, Hromadný Emailer, Licence Server, a ještě by se něco našlo.

Tato šílená 60MB Instalačka pro ASPNETCORE (Lin/Win/Docker/GCloud) a snad každý typ
Databáze jediným příkazem obtiskne libovolnou databázi do Projektu a již Brzy
teď jestě manuálně, zkopírováním šablon zduplikuje tabulky na API s automatickým napojením
na všechny nástroje serveru, které po celou dobu nevidíte.

Web je v Metro4? Ultra nová technologie, byť 5let stará, vidět nikde není
Zato kritiky na můj Tscript Web s konstruktivním obsahem a ne nějakou reklamou co čekáte - bylo ažaž

Tak nyní je vše ke stažení na adrese SHOWROOM port 5000, Celý 60MB EDC Server, k němu EBSManager třeba s napojením na core logování
přes Web Socket nabízí všechny obsažené služby a servery zdarma.

Další vývoj či převzetzí stávajících řešení Backendů je otázkou dní - a ne měsíců jak doposud

Tak kdo zvládne nainmportovat databázi (již rok nabízím i s import scriptem), Tak celé to

HITECH řešení může vyzkoušet u sebe doma

Tak, třeba mě zas budete mazat, místo ostatních přínosných příspěvků jako Narrator na mém WIN online serveru
když už nic jiného ničit nemůžete

Přesto stále věřím že se najdou rozumní lidé a navážeme spolupráci,
a za měsíc snad již bude na světě plně automatizovaný GroupWare MultiServer Generator

Sekce DownLoad Vám dá odpovědi


Hledám práci či spolupráci na IČO či HPP (pouze remote s možností občasných návštěv):

Nabízím tvorbu Backend Serverů libovolného typu a použití pomocí vlastního řešení pro zrychlený vývoj
Dále Vývoj libovolných Desktopových, webových či multiplatformních aplikací (WIN + IOS + Android), či v libovolných jazycích.
Oblíbené technologie: Vue(React,Vite,OtherJs), NodeJS, Typescript, PHP, ASPNET, DOTNET, ASPNETCORE, MYSQL, MSSQL, Oracle, POSTGRESQL, OtherDB.

Instalace libovolných serverů či serverových služeb WINDOWS/LINUX
Práce na projektech od A po Z od návrhu technologií/řešení/postupu vývoje až po nasazení/zaškolení/předání

Dokončuji Stávající projekt a mám volné kapacity.
Fér přímá jasná domluva.

napište či volejte, Těším se na spolupráci.
Svoboda Libor
www.groupware-solution.eu
libor.svoboda@groupware-solution.eu
00420 724 986 873


Hledám práci/spolupráci na FullRemote s možností občasných návštěv.

Domluvit se dá na čemkoliv. Bydlím v Žlutava u Zlína

Oblíbené technologie MSSQL,MYSQL, NetCore, NET,WPF,C#, Vue, NodeJS,

  • Vlastní řešení tvorby libovolných MS systémů a Backend Serverů, Doc Serveru, Git Serveru, atd..

Dělám Servery LIN/WIN, Systémy, Nadstavby, Můstky, Implementace API,atd..

Vývojářem jsem už 30let a tudíž mě nezastaví žádný úkol

více o mně:

https://www.linkedin.com/in/libor-svoboda-7b96014a/
https://github.com/liborsvoboda?tab=repositories
https://www.groupware-solution.eu/
https://kliknetezde.cz:8000/ login: tester/tester
https://kliknetezde.cz:5000/
https://kliknetezde.cz/

Nabízím tvorbu Backend Serverů libovolného typu s možností použití vlastního řešení pro zrychlený vývoj Dále Vývoj libovolných Desktopových, webových či multiplatformních aplikací (WIN + IOS + Android), či v libovolných jazycích.Oblíbené technologie: Vue(React,Vite,OtherJs), NodeJS, Typescript, PHP, ASPNET, DOTNET, ASPNETCORE, MYSQL, MSSQL, Oracle, POSTGRESQL, OtherDB.
Instalace libovolných serverů či serverových služeb WINDOWS/LINUXPráce na projektech od A po Z od návrhu technologií/řešení/postupu vývoje až po nasazení/zaškolení/předání
Dokončuji Stávající projekt a mám volné kapacity.Fér přímá jasná domluva.
napište či volejte,

Těším se na spolupráci.

Svoboda Libor

www.groupware-solution.eu

libor.svoboda@groupware-solution.eu

00420 724 986 873


Zdravím před víkendem všechny Tech nadšence

Už, zatím ještě lokálně, ale již Generuji libovolné Backend servery a desktopové systémy. Jak?
Podívejte se na náš nový Portál stvořený za 30dní
na http://KlikneteZde.Cz:5000 sice v angličtině ale s implementovaným překladem

kde najdete Kompletní Dokumentace, návody, Servery k vyzkoušení.

Bez registrace si můžete prohlédnout
Online Generátory Galerií, videí, Dokumentací, Prezentace,
Moderní Tooly pro Webové stránky a webové systémy,

které Po registraci budete mít k použití a stažení ZDARMA

Nabízím také své Kapacity k tvorbě libovolného BE/FE softwaru,
Serveru, rady či jakoukoliv jinou spolupráci

Toto byl krok k přípravě Online Generátoru Backend serverů
který bude již brzy dostupný OnLine

Toto vše je přínosné jak vývojářským firmám, tak jejich klientům

A to vše jede na obyčejném počítači
navíc s možností online vyzkoušení EASY SYSTEM-Builderu
na https://KlikneteZde.Cz

V případě dotazu mne neváhejte kontaktovat
Těším se na společné úspěchy
Váš http://GroupWare-Solution.Eu


Konečně dokumentace psaná za běhu...

Přiznejte se kdo z vás ma binec v dokumentacích nebo je nemá vůbec?

Konečně je tu nástroj, který umožnuje psát snadno a rychle dokumentaci za běhu. A Jak - přímo z webu, jen zkopírujete vaše poznámky - uvpravíte vzhled doslova jak budete chcít a uložíte. Dokumentace se sama overzuje, sama se překládá do libovolného jazyka. Jsou tu i další možnosti - exportovat do libovolných jazyků, vkládat naprosto cokoliv včetně grafů, schémat, struktur, UML, map , prostě cokoliv. Lze také exportovat do HTML a vložit do webu.

nebo co více vytvořit z dokumentace samostatný StaticPage Web s fultextovým vyhledávačem nazvaný ExpertDocManager. Běži ve 3 módech:

  1. samostatný editor,
  2. Doc Manager souborů ve složce,
  3. ApiDocManager s automatickým verzováním.

A aby toho nebylo málo, protože je to upravená technologie MarkDown rozšířená o další možnosti je k aplikaci i multijazyčný webový prohlížeč taktéž static Spa, který stačí jen nakopírovat do vašich současných stránek. Toto a mnohem více umožnuje nový software Static Web spustitelný pouhým poklikáním na index.html. ApiManager i prohlížeč a mnohem více najdete na https://kliknetezde.cz:5000/solutionservers
či přímo https://kliknetezde.cz:5000/Tools/ExpertDocManager/ a https://kliknetezde.cz:5000/Tools/ExpertDocViewer/
kde po načtení jen klikněte na reload Files


A je tu Další Novinka - Přes noc jsem vyladil Simple/Safe Privátní Git Server s možností sdílení

za pouhé 3000Kč - Server/5000Kč celý kód NETCORE6. Připravena Instalačka. EASY to USE.

a zpět k:

JEDINEČNÁ NABÍDKA - IMPLEMENTACE AUTOMATICKÉHO PŘEKLADAČE DO LIBOVOLNÉHO WEBU
(aplikace, stránky, script, atd.) podmínka - Internet Online

Vaše stránky ve všech jazycích bez námahy - natrvalo, možnost i dodělat další vychytávky
jako hromadný Export ve více jazycích (PDF,HTML,MD), atd, atd...

Automatická Mediální Dokumentace ve všech jayzcích za pouhých 5000Kč
nikoho nezaujaly, tak tu máme po týdnu programování ve volném čase další novinku

NABÍZÍM IMPLEMENTACI AUTO PŘEKLADAČE DO LIBOWOLNÝCH WEBOVÝCH STRÁNEK
ČASOVÁ NÁROČNOST 1-3 DNY ZA JEDNORÁZOVOU CENU 3000-5000Kč

Váš web tak bude po změně jazyku automaticky online přeložen do kteréhokoliv jazyku,
bez jakékoliv nutnosti něco ručně překládat.

Lze nasadit na wšechny typi webových aplikací.
Ukázky použití najdete třeba na:

https://kliknetezde.cz:5000
https://kliknetezde.cz:5000/server/Downloads/ProjectManagement/ExpertDocViewer/
https://kliknetezde.cz:5001/ ProjectManagement username/password admin@admin.eu/admin

Na portálu naleznete také spusty NoBuild Static Pages řešení, a mnoho dalšího


Tak Moc? jednorázová platba 10 000Kč/30 000Kč - Multimediální web možný i za Jediný Den

Nabízím ke koupi či provedení Universální AspNETCORE6 Server Projekt
sloužící jako multifunkční server k provozu

MULTIMEDIÁNÍ | MULTIJAZYČNÉ | INTERAKTIVNÍ:

WEBOVÉ STRÁNKY | PORTÁL | SOC. SÍT | INTRANET

s automatickým překladem obsahu do všech jazyků
na technologii ASPNETCORE6 pro OS LINUX,WIN,MAC,GCloud,Docker.

Projekt je připraven po 10 dnech (80hod*500) pro kosmetický portál, ale prý ostupuje

  • normálka a projekt Odřekl bez zaplacení že prý
    od začátku chtěl hotovu Úvodní Finální stránku zadaného vyhledání. (Prý to musí umět i bez dat)
    Tak toto je výsledek tvorby řešení za 10 dní
  • snad se na mne usměje štěstí a pochopíte to vy a přeci je vydělám.
  • Takže Ještě dnes rychle proměna v plně uživatelský Web s Administrací Group/SubMenu i Stránky,Banování,Limit Vkladů na IP,

Každý si může v Editoru Udělat 1 stránku na IP adresu - tak třeba nastal čas Aby se IT ukázaly
co dokáží s prostředky, které můžete vidět na mém portálu Https://KlikneteZde.Cz:5000

Projekt je již připraven k Extra rychlé Implementaci Libovolného webového Obsahu.
Server Využívá přes 100 Technologií.
Součástí je i vlastní MS IS System s Fakturací, Licenčním Serverem, MultiPobočky + 40 agend,

Další implementované služby serveru s rychlou konfigurací:

  • hromadné zasílání emailů
  • Agenda multimediální verzovaná dokumentace - pro - help,info,popisy,lektáky, manuály, formuláře,statistiky,
  • Download sekce
  • vlastní FTP Server
  • Vlastní Management Dokumentace ()
  • Monitoring sítí, HW/SW/služeb/
  • Copy/Paste/Stránek Obsahu (Razor,JS)
  • Dynamické API rozhraní s šablonami, SRV Schema, Auto Verzování
  • Web Hromadné Funkce Zobrazení Galerií,videí, Prezentací s možností generování vlastních v klientské sekci
  • Klient pro vzdálenou konfiguraci a správu serveru
  • Neomezená možnost dalšího vývoje, rozšíření
  • K dispozici rozšíření [GitServer, Projekt Management]
  • k dispozici veškerá Dokumentace podpory vývoje způsobem COPY/PASTE z Knihovny nástrojů (200+)
  • Kompletní Dokumentace jak na to, Inteligentní Dokumentace, video návody, vzdálená Podpora
  • IS je jednodušší vývoj: Webová administrace i administrace webu z IS
  • Implementovány Nejpokročilejší technologie Serverem pro Nejednodušší druh Vývoje
  • 100+ dalších Mediálních nástrojů rozšíření je součástí serveru
  • Nejpracnější je Dokumentace - je to Vždy nejpracnější úkol (i ona má už svou šablonu :)
  • Metro4 100+ nástrojů
  • Mermaid 100+ schémat
  • přes 50 hotových nástrojů - prohlížeče, editory, buildery
  • Javascript = Unlimited

Šikula, Grafik či jen s chutí mohou zde vytvořit více než běžný prezentační Web za jediný Den

Projekt je k vidění na https://kliknetezde.cz:8000 s funkčním distribučním loginem
Vývoj 1 libovoné agendy nezabere více než den.

např. plánovací kalendář, emailing, eshop, chat, messaging, atd, prostě cokoliv
viz ukázky kódů s stránek v sekci "ke stažení"

po jednodenním školení jak vyvíjet stránky to dokáže kdokoliv znalý tvorby DB

Takže nyní stvořený engine zkouším nabídnout vám

  • a vydělat si alespoň na chleba

Instalace webového serveru 5000Kč- bez zdrojového kódu, možný libovolný vývoj se sazbou 500Kč / hod.
Předání Projektu Cena 30 000Kč - GitHub kód
možný libovolný vývoj se sazbou 500Kč / hod.
možný libovolný další vývoj 500Kč / hod.


Potřebujete Systém, Web, či aplikaci v řádech týdnů?

Tady je řešení...Systém Golden MS + Web - jako vzpomínka na mrchu co neplatí za práci...

  • API + FTP + MaasMail + Download + 100+Tech + 50+Tools

S rychlostí buďte shovívavý, jede mi to na virtuálech doma

Informační Systém s vlastním Interaktivním Web Portálem
Web je plně generovaný z Web Builderu pomocí HTML editoru.
Není tak nutný žádný zásah programátora (to jen v případě rozšíření API)

Jen pomocí HTML builderu a kopírování kódů ze šablon stvoříte téměř cokoliv.
Řešení obsahuje Nepřeberné Množství Modůlů, Doplňků a nástrojů a možností.

Svůj vlastní API Server, kde pro vývoj převážně jen kopírujete šablony.

Dvojí Administrace Webu je možná jak z MS Systému tak i z Web Administrace

Stvořit Libovolný systém ze šablon dalece přesahuje vaše běžné,
náročné i Specifické požadavky dnešní doby...

A to vše stačí pro celý svět v mateřském Jazyce, o překlad se stárá Online Translator

Ukázka MS systému obsahující Web Administraci najdete na https://kliknetezde.cz
Ukázku 100% Generovaného webu najdete na https://kliknetezde.cz:8000
Ukázku dalších nástrojů, popisy modulů, možností atd jsou na https://kliknetezde.cz:5000

A to vše Plně modifikovatelné připraveno
k Libovolnému nasazení pro plnění vašich potřeb

Tímto hledám nové zakázky, jelikož mám volné kapacity,
které chci vyplnit jakožto živitel rodiny...

Tak Snad už se najdou moudří lidé co potřebují IT cokoliv (ne podvodníci)
a zahájíme plodnou spolupráci

s podzravem
Svoboda Libor


Potřebujete firemní Systém, nadstavbu, datový můstek, dotykový terminál či nově Web portál?

https://kliknetezde.cz - Ukázky Systému Online - otevřete v anonymní stránce kvůli certifikátu
https://kliknetezde.cz:8000 - Ukázka portálu online tester/tester přihlášení pro zobrazení web builderu
(bez nutnosti programování) můžete si zobrazit kód každé stránky webu

https://kliknetezde.cz:5000 - Popis projektů, dokumentace, nástroje, řešení, dema ke stažení, a další projekty

EDC & ESB jsou připravené řešení na jednoduch0 3vrstvé arcitektuře.

Tak jednoduchý vývoj systémů nikde jinde nenajdete a ukázky jsou všude i videa na youtube.

Je pravda ale že marketingově to ještě nemám dostatečně zpracované,
protože pro českou IT společnost je bohužel nutné to podat ještě jednodušeji.

Vyvíjet kromě datové části – kterou má každá firma jinou – v tom právě spočívá customizace , není vlastně co.

Cena za dodávku systému s 1 customizovanou agendou je 10 000Kč bez vlastnictví kódu
a každá další agenda 500-5000Kč dle složitosti (tzn. i ta nejsložitější třeba práce s videem se vejde do 10hodin)

Vlastnictví kódu lze dokoupit za 2x 25 0000Kč každé řešení EDC&ESB včetně 2hodinového zaškolení vývoje.
2 hodiny školení stačí a budete si umět vytvářet agendy sami - Tak snadný je vývoj.

pro WEB vám stačí EDC - EASY DATA Center - FTP,WEB server s mnoha přidanými dalšími funkcemi, vlastním WebPortálem+builder
(libovolný OS, libovolná DB, MaasMail,ServerBrowser, Any Web server type support, RAZOR,BLAZOR,SOCKET,Node,SPA,atd..)

pro MS System je potřeba ESB - EASY SYSTEM Builder - Windows systémové jádro pro vývoj a běh libovolného systému
(datové můstky, agendy, komplexní firemní systém, multimediální systém, nadstavby systémů, dotykové systémy, atd...)

Cena prací 500Kč/Hod

s pozdravem
Svoboda Libor

Žlutava 173
763 61 Žlutava

IČO: 869 73 681
DIČ: CZ 800 629 5319

mail: Libor.Svoboda@KlikneteZde.Cz
web: www.Groupware-Solution.eu
Mob: 724 986 873


Nabízím Dodávku a instalaci libovolného MS Systému již od 10000Kč bez vlastnictví kódu

  • 1 agenga dle vlastního zadání (1 Tabulka),
    výběr z 50 existujících agend (fakturace,objednávky, multipobočky, položky, adresář,...)
    neomezený tisk s vestavěným ReportBuilderem
    multimediální web portál s builderem je součástí (stránky tvoříte v html editoru)
    vlastní FTP,Web,Licence,MaasMail - Server
    Automatické API rozhraní,Data Manager, MD Manager
    Možnost zakoupení kódu pro vlastní neomezený vývoj 25tkč za projekt(EDC,ESB)
    Možnost zaškolení vývojáře - stačí pouhé 2 hodiny pro vlastní vývoj
    3 vtrsvá technologie - DB, Backend Server, MS Frontend Aplikace
    více než 50 nástrojů pro Web, 100+ web objektů, Multimediální rožšíření, animace
    a mnoho dalšího a to vše hned ze Startu

MS system online k vyzkoušení na https://kliknetezde.cz
nebo Web Portal https://kliknetezde.cz:8000 login:tester/tester
či Web Tooly a jiná řešení https://kliknetezde.cz:5000
nebo v Download https://kliknetezde.cz/server


Chcete pohnout s IT Projektem?

Chcete realizovat váš nápad? máte poptávku na IT a zbytečně ji pouštíte k vodě?

Takto vypadá má stručná fakturace současnému klientu/hotové tasky:
23.10 10 - app review,app reservations,web guest detailShown
24.10 12 - komentáře hostitele, web komentáře a hodnocení
25.10 10 - balíčky kreditů,oprava dost pokoju/stejnyTypVicekrat,zadani date 1 tak auto do nextDay
26.10 8 - ExtraBed, refresh all terms
27.10 16 - Extrabed, Kalendář, Poptávka Update, Advertiser Calendar + Data View,Top5
28.10 14 - AppPřehledy-Oblíbené,rezervace,pokoje,oblibené,graphMail,Edit-Host/Advertiser,
29.10 8 - AppEdit-GuestSettings,App/WebRole,MultiBooking Calendar,

další možnosti:

  1. nabídnout za 10tkč implementaci editoru dokumentace (editace jako admin z webu, save v DB, obsah zobrazován jako nápovědy/nebo you video)
    https://kliknetezde.cz:5000/server/Downloads/ExpertDocManager/ExpertDocViewer/
    https://kliknetezde.cz:5000/server/Downloads/ProjectManagement/ExpertDocViewer/
  2. uvodní text může být náhodný z tabulky MOTTO
  3. Emailer Sender rozhraní pro zasílání emilů/newsleterů zpráv
  4. možnost naimplementovat fakturaci pro admina - dám zdarma
  5. možnost dolňkový WebEditor pro admina - Metro se musí dělat v apce
  6. možnost panelu nástrojů a vydáthnout AdminApiDocs,DataManager,Server & Net diagnostic

Tak neváhejte a Ozvěte se mi a domluvíme se na spolupráci.
Dodávky IT všeho Druhu: Weby, Systémy, Servery.

Svoboda Libor
https://www.linkedin.com/in/libor-svoboda-7b96014a/
https://github.com/liborsvoboda?tab=repositories
https://www.groupware-solution.eu/
https://kliknetezde.cz:8000/ login: tester/tester
https://kliknetezde.cz:5000/
https://kliknetezde.cz:5000/server
https://kliknetezde.cz/


Nabízím své služby...

Jsou tu vánoce, Čas utratit uspořené Peníze ušetřené na Státu, už je jen rozumně Investovat.
Nebo Sami dodáváte IT? Chcete začít dodávat Několik Systémů Měsíčně?

Zde je Řešení: MultiSever+MultiSystem+MultiWeb celé v Multi jazycích
EASY-DATA-Center a EASY-SYTEM-Builder
Obsahuje Více jak 20 typů Serverů FTP,Web,MaasMail,Monit,API,Git,TaskMan,License,Document

Součástí je i IS MS System s 80 agendami pro výše uvedené servery a Navíc.
Multipobočková Nab/Obj/Dob/Pokl/Fakturace, Výkazy výroby a ještě dále.

ale nešlo by to bez Multimediálního Dynamického Web Portálu.
Tvoří se jen pomocí Editorů z Webu či IS Systému s použitím HTML,css,Javascript.

Ktomu ale slouží více jak 200 objektů, které jen kopírujete a nastavujete.
A navíc můžete vybírat z hotových 5x portálů,5x systémů,50 webstránek,10 editorů,
20x prohlížečů,100x doplňků,100x animací,atd.. které jsou nachystány k použití

Podporovány jsou Všechny OS, Všechny DB a lze Vyvíjet Již jen Šablonami a Auto Funkcemi

Nevěříte? Podívejte se na multijazyčný Portál stvořený tento týden: na https://kliknetezde.cz
a Vyzkoušejte si sami Online v Editoru použitím Knihovny jak snadno lze tvořit.

A k tomu Nadřízený Management MS System Golden na https://kliknetezde.cz:8000
s agendami pro správu serveru, portálu, dokumentace, fakturace, výroba, atd...

Dnes ještě do řešení ještě doprogramuji Auto službu: Stažení celého Webu do Zipu :)
a to nabízí poznamenat si vytvořit úplný Public Online WebModeler ?
Tak mrknětě v jaké fázi je už teď.
A takto, můžu na počkání upravit cokoliv byste si přáli

Neváhejte mne kontaktovat a zahájíme spolupráci,
či jen kupte Řešení pro vaše IT Oddělení s 1 denním školením.

Cokoliv je možné libovolně upravit, nebo si objednat řešení na Otisk prstu
MS Systém k vidění na https://kliknetezde:5000, Web Portál na https://kliknetezde.cz

Dodávám já https://GroupWare-Solution.Eu Centrální Řešení Vašeho IT

Teším se na Vás...


EDC + ESB ještě Více než jen Interaktivní Mediální SYSTÉMY

EDC+ESB pouhé 2 jednoduché projekty umožňující
sestavit Jakýkoliv SYSTÉM, WEB, Portál atd..
striktně 3Vrstvá Technologie, tedy:
jakákoliv DB + Backend API server EDC + MS Systém ESB

lehce modifikovatelné jen s pomocí šablon
dokáži vykouzlit libovolný WEB či Desktopový Systém.

Chcete Informační Systém? nebo Webové Stránky? Jak?
Jednoduše budete jen kopírovat šablony pro API a Formuláře
a po vytvoření tabulek a k nim příslušných formulářů

  • máte hotovo = Medální MS Systém třeba i s tvorbou 3D.

Nahlédněte na https://KlikneteZde.Cz a
vyzkoušejte si tvorbu Webu Online v připraveném Inteaktivním ŘEŠENÍ Webu.

Nebo se podívejte na MS SYSTEM online na https://KlikneteZde.Cz:8000

1 Měsíc trvalo vytvořit portál v cshtml-Razor|Mvc
ještě s Buildem a nasazením na https://KlikneteZde.Cz:5000
nyní již stačí Online Editor či přímo Editory v MS Systému

Řešení se nazývá EASY-DATA-CENTER a EASY-SYSTEM-BUIDER
více v IT již nepotřebujete.

Ozvěte se a zjistěte více jak si pořídit daná řešení ještě DNES
Dodává fa https://GroupWare-Solution.Eu

Teším se na Vás...


Zdravím Všechny zájemce O IT, které je přínosem a né přítěží.

Také Hledám zájemce o mé služby IT a zde je názorná ukázka mé činnosti...

Mé Unikátní Projekty EASY-IT-CENTER + ESB - už ne EASY-DATA-CENTER,
protože rozsah Služeb serveru vykrývá téměř celou IT AGENDU (chybí už jen Email server)
a za to převyšuje Mnohem více službani navíc Například DB Notifikace EMAIL,SOCKET,..

ALE co je ta Další NOVINKA?
Právě jsem dokončil nový SOFTWARE: STATIC Web STUDIO,
které jsem začal psát před 3 DNY 24-27.12.2023.

SYSTÉM ZA 3 DNY - potřebujete také systém? Ozvěte se...
můžete sami posoudit, najdete ho na:

https://KlikneteZde.Cz/server-web/static-web-studio/

Takový SYSTÉM U/Vidíte 1x v životě, že?
Jen 3 Dny tzn. 163750Kč = Kdybych dodával třeba Právě Vám

A k čemu slouží? k tvorbě celých Webů, Portálů, Intranetů,
EShopů a WEB COKOLIV alespoň ve spojení s EASY-IT-CENTER či jiným API serverem.

Nahlédněte ALESPOŇ ze zvědavosti o IT, či ZDA SI JEJ NEZAKOUPÍTE?
AKTUÁLNĚ jej podceňuji na POUHÝCH 10000Kč.

K vyzkoušení ONLINE na
https://kliknetezde.cz/server-web/static-web-studio/

Stačí vám 2 Nástroje, Studio A Tool Creator, pravda je ale
taková:

  • více než 400 COPY/PASTE objektů pro tvorbu čehokoliv.
  • Implementována SQLite Databáze pro Samostatný BĚH na ANY WEB server
  • Nástroj Automatický Překlad Do všech Jazyků, včetně všech manuálů,atd..
  • přes 50 dalších Editorů,Prohlížečů, Galerií, Grafů, Schemat
  • 50 šablon moderních Web Stránek na stále stejné technologii METRO
  • Implementovám Grafigký Modul pro Schémata, Grafy, Struktury, UML,..
  • Implementován Animační Modul v více jak 50 druhy Animací navíc
  • Generuje Online Static Stránky, s JS API, bez Buildu, Online změny
  • více jak 1000 Příkladů pro COPY/PASTE použití v Dokumentacích
  • ONLINE PODPORA - Těším se na každou Novou Spolupráci
  • Navíc K Dispozici MS SYSTEM z řešení EIC+ESB s více jak 50 službami
  • JEDE na Všech WEB server - JE STATIC, TZN. nepotřebuje nic než URL
  • Není potřeba víc než HTML,CSS,JS - vše předchystáno

MS System ONLINE na https://KlikneteZde.Cz:8000 s kompletní správou Všeho

a mnohem více.., stačí se ozvat, pročíst dokumentaci, Vyzkoušet Online..

v IT aktivní 33let Svoboda Libor, snad to už vidíte...
00420 724 986 873
libor.svoboda@KlikneteZde.Cz
libor.svoboda@GroupWare-Solution.EU
tak neváhejte a Využijte potenciál mých služeb a produktů...


EASY-IT-CENTER & EASY-SYSTEM-BUILDER CENY, VÝVOJOVÝ PLÁN

9.1.2024 nasazeny Aktuální verze na Domácím PC na vesnici k vyzkoušení
CO BUDE FINÁLNÍ?

  • ONLINE GENERÁTOR MS SYSTÉMŮ DLE STRUKTURY DB
    • BUILDER PRO TOUCHPANELY, BUSINESS PANELY, ANY SYSTEM
  • WEB PORTAL s MULTI WEB SERVERS - cokoliv z GITU (React,Php,Electron,Vite,Gulp,..)
  • SUBDOMAIN WEBSITES - dá se říct skoro JEDNODOMÉNOVÝ HOSTING
  • MULTI IT SERVERS & SOLUTIONS, již nyní s velkým počtem Unikátních Funkcionalit

Změny ve volných chvílích při zaměstnání 12.2023 - Nestačím Zapisovat https://KlikneteZde.Cz
30.12 Generic API , nyní stačí registace názvu nové tabulky do příslušné Skupiny Dle Práv
29.12 Agenda Dynamické Moduly a Služby [custom HTML/CSS/JS API moduly] + Sekundární Zabezpečení API
28.12 Připraven Interface pro DBWebStatic FileStructure
27.12 Agenda Static WebSites - další webstránky na subdoménách url://website.domain.xx nebo url://domain.xx/website
26.12 Agenda Operace Systému - DB SP operace, Import/Export/Backup/Clone/Generate Docs/Generate DB Object atd..
24-27.12 STATIC WEB Studio https://kliknetezde.cz/server-web/static-web-studio/ - prezentační fáze pro Global Administrátor
23.12 Předělána Agenda ServerSetting do Dynamic Form, nová nastavení automaticky přiskočí

9.1 po změnách Změna Klient Setting na Generic Form + MultiSameTab + MultiInstanceCloneByDrag

09.12.2023
ESB - Implementován SystemMenu ToolTip Dle Param nastavení, zobrazen Popisek menu
ESB+WEB - Imlementována Agenda Správa globálních HTML, a Finálně převeden Layout do DB správy
Web je Nyní Plně v Režii DB a je Skládán z částí HTML Globální + Stánka z Editoru dle Práv v nastavené sekvenci

Ceník EITC-ESB = EASY-IT-CENTER & EASY-SYSTEM-BUILDER
Kč 30000 EITC-ESB Limited = MS řešení s Portal s omezeným multiwebserver 10x,AutoSched 10x, StaticWeb 1x
Kč 50000 EITC-ESB Unlimited = Kompletní řešení Unlimited
Kč 100000 EITC-ESB OpenCode = Uvolněny kódy pro vlastní Vývoj pro Vlastní Potřebu
Kč 150000 EITC-ESB OpenServers = +WEB/MS Doc Server,GitServer,TaskManServer a budoucí (Email,Notify,atd..)
Kč 15000/rok EITC-ESB MainTenance = K dispozici unlimited aktualizace, Online Správa Projektů, AutoUpdate/AutoRepair
Kč 1500/hod EITC-ESB RemoteSupport = Online Tel/Remote podpora
Kč 30000/Tyden EITC-ESB DevTraining = 2dny Kompletní Představení produktů,1den Zaučení vývoje,2dny BONUS tvorba dalších MS/Web Agend
Kč 500000 Partnerství a Distribuce = Plný přístup ke všemu, spolupartnerství při vývoji, udávání směru a priorit

VÝHLED 2024

LÉTO 2024 -
ONLINE GENERÁTORY - API,MS FORM, WEBFORM(z json),
ONLINE Správa klientských Projektů,Build Projektů, Nasazení Změn, Refactor, Stažení Instalátorů

ZIMA 2024 - Průmysl - Implementace Siemens, TouchPanel Builder


EIC&ESB EasyITcenter & EasySYSTEMbuilder - Jediné Řešení pro celé Vaše IT

provozováno zatím na stanici na vesnici, to je důvod aktuální rychlosti
LZE PŘEDVÉST NA VAŠICH PC

Systém byl právě jedinou DB Tabulkou rozšířen o podporu Modulů
Libovolného programovacího Jazyka. Byly nahrány Pomocné ,
Informativní a Předchystané Moduly, které mám v plánu naimplementovat.
WEB Portal již nelze téměř rozšířit, pouze se bude zdokonalovat
Script Global Knihovna pro všechny potřebné funkcionality.Vývoj
je už ve fázi, že WEB lze vyvíjet plně Dynamicky ONLINE, API Chyb
pouze QUERY Builder pro plně Dynamické API BEZ programování, a Vývoj
Libovolného Systému je již jen Grafická Tvorba Datového či jiného
TŘEBA multimediálního Formuláře.

Nové Video
https://youtu.be/6ThVBv_diGo

Online Web
Https://klikneteZde.Cz

Plné 30denní verze k vyzkoušení,
či si je nainstalujte Klienta a připojte ke sdílenému API serveru
https://kliknetezde.cz/Downloads/EITC

MSQLDB 80MB, Server 100MB, Client 30MB + 1GB ukázkové Doplňky
Ostatní HTML+JS+CSS 10GB k roztřídění a Implementaci

Online System K Prohlédnutí
https://kliknetezde.cz:8000

V případě jakéhokoliv Zájmu mne neváhejte kontaktovat.
PS hledá se OBCHODNÍK ideálně s chutí na Okružní Trasu
po velkých Firmách,kde provede Instalace a zpětná Vazba ukáže

s pozdravem
33let IT vývojář
Libor Svoboda


MultiJazyčné Projekty a Řešení EasyITcenter & EasySYSTEMbuilder

to je Správa IT ve vaší firmě s nejmodernějšími technologiemi a agendami pro všechny typy případů.
Otevřené Řešení nabízí snadnou tvorbu Web Portálu + neomezeně web aplikací pro správu vašeho IT.

Snadná Tvorba Libovolného Systému: IS,Nadstaveb,Serverů,DataCenter,Dotykových Panelů,Controlingu,...
Připraveno Řešení WebHostingu, Generování Webů, Dokumentací, Portálů,...

Snadná tvorba pomocí Editorů v Systému pro správu implementovaných JS knihoven,
JS/HTML Editory pro snadnou tvorbu I/O Web aplikací pro práci s Daty

Agendy pro Monitoring stavů SRV/HW/SW/DB/NET/Služeb v cca 2000 Typů sledování.
Agendy pro Sdílení Dat, MassMailing, WebSocket Messaging a sousty dalšího.

Přes více jak 50 IT agend pro centrální správu IT.
Implementovaný Systém Ovládání. Totéž je možné nasadit ve Web Managementu.

Přes více jak 40 Web Ui Frameworků nachystáno k okamžitému Použití.
Online Nástroje pro další Neomezený rozvoj Projektů pro:Libovolné Servery, Systémy, Weby.

Spuštěna Online Dokumentace, Nápovědy, Popisy a Ukázky na:
https://kliknetezde.cz/EIC&ESBdocs/CodeDocs
Komplet v češtině [všech jazycích] díky zabudovanému Online Překladači

Static SPA Portál generovaný z Editorů Systému můžete vidět na:
https://kliknetezde.cz/Portal

MS Systém k vidění Online na webu najdete na:
https://kliknetezde.cz:8000/

Celé Řešení k dispozici na 30 dní k instalaci v sekci Download
https://kliknetezde.cz/Downloads/Downloads/EIC&ESB/

Přes 20 typů Serverů Ihned k dispozici.
Přes 1000 Web Objektů ke skládání libovolných webu, intranetů, portálů, aplikací....

Připravovaný je Vývoj Online, kde si budete moci vyvýjet své řešení s možností
implementovat nové technologie z Hlavního projektu.
Nástroje pro vývoj Online jsou k vidění v Portálu Dokumentace s CZ nápovědou
Automatická Kontrola chyb a čistoty kódu.

Možnost Implementace Modulů = Nových Agend: Serverů, Systémů, Aplikací, Webů
v libovolném Programovacím Jazyce A mnohem více

Nachystáno dalších cca 200 řešení Serverů, Systémů, Událostí k Implementaci.

Startovací Řešení bez kódu za pouhých 35 0000Kč.

Tak neváhejte a modernizujte své IT, váš Vývoj IT
na Vývoj Online bez nutnosti Buildů a složitých Implementací


EasyITcenter & EasySYSTEMbuilder = celé IT v Jediném Globálním Groupware Řešení:

Naprosto vše: třeba až po Řízení Výroby, Strojů, Průmyslových PCL,Media, Streamy,Touch Panely...
[Generátor Vyrobních (rozklíčováno Siemens PLC 300-15XX) i Business TouchPanelů je plánován na ROK 2025]

STÁLE IGNORUJETE NOVÝ IT VĚK 21.STOLETÍ?
GLOBÁLNÍ EIC&ESB GROUPWARE ŘEŠENÍ OBSAHUJÍCÍ SPOJENÍ VŠECH STĚŽEJNÍCH TECHNOLOGIÍ DO 1 CELKU

  • Přímí Import libovolného Programu (Github), Systém se může zkládat z Různých programů, svázaných pouze Daty

  • Programy mohou být v Libovolném Jazyce: jsou spouštěny Příkazy/jako Include Web/ Extended Tool

  • OTEVŘENÉ ŘEŠENÍ PRO LIBOVOLNÝ UPDATE PŘÍMO NA MÍRU - JEN ŠABLONAMI (či vytvořím NOVOU)

  • KAŽDÁ IMPLEMENTACE JE BRÁNA GLOBÁLNĚ: Nový NÁSTROJ pro Celé Řešení, Update Stávajících Formů

  • V 1 OSOBĚ AŽ 50 NOVÝCH AGEND NENÍ ŽÁDNÝ PROBLÉM - 2 AGENDY DENNĚ (ČÍSELNÍK zabere 1hod)

poznané Z DENNĚ PROGRESIVNĚ AKTIVNÍ 33leté práce v IT
v 15 Nadnárodních Firmách Heunich,Isan,TEVA,Acer,Edts,TVD,...

Hledám IT Firmu, Obchodníka, Zákazníky pro spolupráci na tomto Unikátním Řešení.
Vysvětlím, zaškolím, zaučím: Stačí 1 Týden, (ale sepsat všechny možnosti Řešení: zabere alespoň 1/2Roku)
Chtěl Bych se Věnovat Vývoji: a VY byste mohli Distribuovat Klony:

  • Chystán Online Portál pro Správu projektů, Sílení Nápadů, Knihoven, Chytrý Vývoj Online, Online Update, Online Build

EIC&ESB = Servery, Systémy, Weby, a Komplet správa IT v 1 Řešení
Řešení Pozkládané z Šablon:

  • DB: Tabulky,Prodecury,Pohledy
  • BE: RestFull API, Generic API, Images, Files, Dynamic Procedures, API = Služba (např: MassMailing)
  • FE: Šablony Formulářů číselníků, Agend, 3D, Video, Web, ANY DOC, ANY FILE TYPE Viewer,
  • FYIreporting: Report Resigner/Viewer,cmd, pro Grafickou tvorbu Tiskových Sestav
  • TOOLS: přes 50vyladěných Customizovaných Github Projektů jako rozšíření
  • Jádro: Metro: přes 500+ Objektů pro Stavbu Systému, Webu + Knihovny: Animace,Sequrity,Tools,Funct.
  • Web Tools: přes 100 statických Nástrojů vyladěných ihned k použití
  • Web Tvorba + BE + FE : pomocí vestavěných Editorů,
    Chystán Portál Online - Nástoje k vidění na portále
  • Připravený UPDATE Editorů: UniversalEditor NahradíZastaralé
    (Jednoduchý REPLACE CODE ve VYBVRANÝCH SAMOSTATNÝCH FORMULÁŘÍCH)
  • Server = MultiServer, Multi Lang, Multi Web, Multi Portal, ANY DB
  • System = local MultiWebserver, Multi Lang, ANY SYSTEM, TOUCH, SIEMENS, STROJE, MEDIA
  • Automaticky Překládaná Globální Dokumentace, i 3tích stran do Všech jazyků se všemi Návody,Tipy,Kódy
    • Nachystáno 5GB Statických Nástrojů Použitelných jak v Systému (WebView2/CefSharp + Interní WebServer), tak na Webu
      [web aplikace se tváří jako formulář SYSTÉMU]
      (příklad Inteligentní Dokumentace zabírá 1,5MB)
      (Editory, GEnerátory, Webu, Dokumentací, Stránek, Databázi, Grafiky, 40x Statické Frameworky, Knihovny, Atd.)
      Nachystáno k Implementaci přes dalších 20Typů serverů:
      Video Konference, SSH, Stream, SocketCetral Messaging, Multi Sub Domain Web, MultiWebServer, atd..

Nachystány Nástroje pro tvorbu MVC globálních Editorů pro Celé Static úložiště

Tvorba LIBOVOLNÉHO SYSTÉMU - pouze kopírování FORM šablon a úprava dle Datasetu Agendy: Tabulky
Tvorba LIBOVOLNÉHO SubServeru - řízení Scriptů a cmd příkazů, node ./server.js = nový Web server

Podpora LINUX/WINDOWS/ANY DATABASE/MACOS/MULTILANG/DYNAMIC WEB - tvorba pro Klienty stačí jen zabudovanými editory.
Připravena Implementace Controling, DocumentFlow, Dynamic Report Generator, Online Dev, Private Github,.....

Jsem Ochotný se rozumně Domluvit - Pro Vás je to Možnost Distribuce Unikátního IT Řešení Hned ze startu

  • nabízí se absolutně jednoduchá tvora Agend, Reportů, a jiných Drbek pro zákazníky,

  • Ultra Rychlé Implementace Libovolných Customizací,

  • pro Vývoj Stačí Znalosti Excelu a Týden školení: - Vlastně jen Tvorba Tabulek (pomocí Šablon s pravidly)

  • Vývoj je tak Rychlý, že pracnejší je Optimalizovat a nahrazovat již hotové sekvence: Práce pro juniora (REPLACE)

  • Potřeba Dopsat Dokumentace: Možnosti a dovednosti, Pravidla, Logika, Sdílení, které Řešení Aktuálně již Umí čeká na Sepsání,

    Tato Část AUTOGenerována do Dokumentace [Popisy a Významy Menu Položek]:
    PODÍVEJTE se PROSÍM na POPISY Těchto 4 AGEND ze 100 V Dokumentaci:

    1. SeznamImpl.ModulůServeru
    2. SeznamukázkovýchModulůSystému
    3. MikročíselníkyunikátníFunkce
    4. SeznamImplementovanýchAgend
    5. ExpertDocGrafickéUkázky - Brzy DokumentFlow

    A ŘEŠENÍ OBSAHUJE V DESÍTKÁCH NE-LI STONÁSOBNĚ VÍCE,(Aktuálně v nastavení je méně než 5% dostupných konfigurací)
    :Funkcionalit, Nástrojů, Předchystaných Vazeb v Existujících 100Agendách

    Vše se Kloubí Spojením Všech Typů Jazyků [SERVER, DESKTOP, WEB, CMD, DB, NET] - TÍM JSOU MOŽNOSTI NEOMEZENÉ
    STAČÍ STAHOVAT Z GITHUB, GITLAB, AZURE, GOOGLE, NPM PACKAGES, INTERNET
    A přitorm stačí základy C# pro Libovolný Vývoj:

    • Třída se Překlápí z Tabulky - Tabulka z Šablony
    • FULL API se Navazuje z Šablony na Třídu = BE Hotovo
    • Formulář se Překlápí z Tabulky přes Šablonu TYPU Formuláře
    • Reakce formuláře jsou dané Systémem Jsou Součástí FORM Šablony
    • Jen Otevřít Definici Menu, Vybrat Nově Detekovaný Form a přiřadit Práva, umístění v Menu a Překlad
      = FE Hotovo
      A JE TU NOVÁ: AGENDA, ČÍSELNÍK, EDITOR, PROHLÍŽEČ, GRAF, VIDEO, DOKUMENT, PŘÍLOHA, NOTIFIKACE, SOUBOR, PŘÍKAZ,...

Tak si nenechte utéci Příležitost Dodávat DOSLOVA DESÍTKY SERVERŮ, SYSTÉMŮ, WEBŮ I MĚSÍČNĚ
z Centrálního Řešení s možností sdílení veškerého Vývoje s Klienty - Odkup Agend Od klientů do Central Systému.
MULTI LANG SERVER/SYSTEM/WEB [nic jiného neexistuje vše je buď Server/System/Web]: Tedy Řešení pro Celý Svět.

Já budu dále Pracovat na rozšiřování JADRA SERVERU A SYSTÉMU:
Jsou To 2 C# Projekty: NetCore6 (+ANY WEB) a NETfrm 4.6.2 WPF - umí naimportovat Libovolnou APP jako Modul
Vše Online K Vidění JIŽ NYNÍ, Provozuji doma na starším Serveru jako SRV.Farmu:

Nově Spuštěn AZURE Virtuál 2CPU,8GBRAM,WIN10,pro Provoz Serveru,

  • SYSTEM Klienta si můžete Stáhnout, Rozbalit nastavit API URL Serveru a Vyzkoušet u SEBE Doma

V dokumentaci aktuálně možnost procházení kódu projektů a podívat se na strukturu a složitost.

Lze se Domluvit třeba i na Distribuci/Implementaci Samostatných Nástrojů
(Implementováno přes 300 a dalších 500čeká): Brzy K vidění na Serveru, Zdroj Github.

UŠETŘETE SI I SVOJI PRÁCI A ZAČNĚTE POUŽÍVAT TOTO ŘEŠENÍ.
VYVÍJET BUDE MOCI KAŽDÝ KLIENT DO CENTRÁLNÍ BANKY FUNKCIONALIT - NE DATA
30DENNÍ PLNÁ VERZE S NÁSTROJI KE STAŽENÍ (VELIKOST dělají Implmentované Statické Nástroje)
30DENNÍ MINIMAL PLNÁ VERZE (bez statických nástrojů ke stažení)
https://KlikneteZde.Cz DocPortal,WebPortal,150 Apis, Plné Řešení s 7GB Static Nástrojů a Knihoven
https://KlikneteZde.Cz:8000 SYSTEM Online
https://GrouWare-Solution.Eu Ovládané Technologie a Řešení(implementované do USER-Friendly Systému)

tak Vyhoďte Vašich 10 a více Serverů a Nahraďte Jej Jediným. = Úspora Energií, Náročnosti, Prostředků,..
1 ŘEŠENÍ = MAXIMUM KOMPATIBILNÍCH 100% VAZEB

ČI SI CHCETE OBJEDNAT ŘEŠENÍ ČI SYSTÉM NA MÍRU?
EXTRÉMNĚ RYCHLÉ = LEVNÉ DODÁVKY NA MÍRU S TECHNOLOGIEMI, KTERÉ JINDE NENAJDETE

00 420 724 986 873
Svoboda Libor ITčkář celou Duší s nutností dělat na jiných projektech pro uživení rodiny
Projektům mohu aktuálně věnovat 1Týden Měsíčně - I TAK = VŽDY ZÁSADNÍ POSUN

Neváhejte Mne s čímkoliv Kontaktovat, Rád Vše Vysvětlím/Předvedu.
Moje sazba je pouhých 750Kč/Hod s Nasazením dle potřeby (až 240Hod/Měsíčně)
V IT od 1991Atari 65XE(Turbo,Basic) - DOSUD


opravdu VLÁDNE V CZECH IT SLEPOTA?

https://kliknetezde.cz/EiC&ESBCodeBrowser/index/index.html

EIC&ESB NOVA VIZE: AUTOMATICKE GENEROVANI WEB/MS ANY SYSTEMU EDITOREM

!!! HLEDÁ SE SPONZOR
prave pracuji na portale VYVOJ online a SKOČIL mi do TOHO TENTO NÁPAD
Tim se DOSTAL na TOP PRIORITU. Neni ale Volný čas musím VYDĚLÁVAT JINDE.
POKUD SE NAJDE SPONZOR, MŮŽE TENTO NOVÝ NÁPAD PRODÁVAT UŽ DO 14 DNŮ

Finální Řešení pro Generovaní SYSTEMŮ+WEB SYSTEMŮ pouhym Založením Tabulky v DB.
ZDE JE POPIS JAK NA TO:

1] Vytvořit Tabulku třeba s napovědou jak na to TemplateTableList již nyní]

2A] Překlopit na BE Server jako Pevně Danou API = SCAFOLFING
s použitím TemplateTableListApi.cs šablony již nyní
nebo
2B. Naiplementovat jako [Chystáno] DYNAMICKOU API pomocí SQL Definice z EDITORU

3] a Nyní MÍT Připravený GENERÁTOR HTML + FORM TEMPLATE
tak jak už mám Šablony FORMUÁŘŮ nyní

= nová STATIC URL ADRESA na SERVERU - Kterou stačí Vložit do SYSTEM MENU
jako NOVÁ WEB AGENDA lze již nyní, + Nastavit Oprávnění

A JE HOTOVO

JESTLI TOTO NE NAPROSTY PRELOM v IT tak už FAKT NEVIM.
Pouhým naklikáním Libovolneho Typu DB[Tabulky+Indexy+ForeignVazby] dostanete
celý IS SYSTEM, CONTROLING, TOUCH PANELY, WEB SYSTEM
či LIBOVOLNY SYSTEM založen na SYSTEMU AGEND.

POUZE NOVE FUNKCE coz je u IS SYSTEMU NULA NULA prd budou vyžadovat trochu namahy.
[myšleno TŘEBA STREAM VIDEA - VYSILANI TV]

A to JEDNODUŠE s možnostmi:

  • vyřešit v JS,HTML,CSS Přímo ve formuláři ONLINE,
  • nebo v C# na BE SERVERU v CHYSTANEM VYVOJI ONLINE
    +Rebuild a Nasazeni nove Verze na SERVER
  • nebo LZE implemetovat Podporu i jinych jazyku ALE PROČ
  • ČI POŽÁDAT MĚ A V REKORDNIM ČASE BUDE VYŘEŠENO

TAKŽE VÝVOJ DEV PORTALU ONLINE ODKLADAM A AŽ NAIMPLMENTUJI
VÝŠE ZMÍNĚNÉ A JAK BUDE ČAS SE K NĚMU VRATÍM či NAJDE SE SPONZOR?

tady se podívejte JAK MĚL VYPADAT:
https://kliknetezde.cz/Servercoretools/standaloneapps/developerboard

Systém s EDITORY k Vidění na https://klikneteZde.cz
Multi WebServer s Multi Dokumentací na https://KlikneteZde.cz/
SYS Editorem Generovaný Portal: https://KlikneteZde.cz/Portal
Globální zatím jen 5% Dokumentace: https://kliknetezde.cz/server-doc/md-book/book/

Nebo SE MI ZASE BUDETE POKOUŠET NAHRÁVAT NA SERVER Č-URÁKY?
Tak Kam v OBLASTI IT patříte VY?


Úvod EIC&ESB-Globální IT Řešení na míru

EasyITcenter & EasySYSTEMbuiler - Globální Řešení vašeho IT Obecné Informace o Struktuře, vazbách a možnostech tohoto Unikátního Globálnho Řešení Celé oblasti IT až na malinké vyjímky.

Úvodní Informace o vlastnostech a použítí projektů, které je nyní mnohem širší a proto si projděte další informace, kse se dozvíte více

Minimal Info EIC+ESB

Pro myšlení, vývoj nástrojů a práci s nimi hodné 21. století
Visual Studio C# projekt EIC ASP NETCORE6
Visual Studio C# projekt ESB NetFramework4.6.2

  • naprosto snadná pro tvorbu 3-vrstvých systémů (LIBOVOLNÁ DB, BACKEND-SERVER, FRONTEND-KLIENT) se znalostmi excelu
  • Stačí vytvořit tabulku pro data a formulář, vše v grafických designérech
  • Takže se doslova proklikáte systémem, každý den 1 tabulka = prodejní systém s objednávkami a nabídkami za měsíc

A to není ani náhodou vše.
Nemusí to být jen datový systém, ale bez problému i multimediální, pro stříhání videí, práci s fotkami nebo 3D
nebo dokonce ŘÍDÍCÍ SYSTÉM pro řízení stroje (v současné době je podporován PLC SIEMENS),
řešení je chystané na Rok 2024.

Nebo Řídicí systém, Zálohování, DataWarehouse, Controlling, BI OLAP, Flow Processes,
Výrobní, informační nebo obchodní dotykové terminály. LZE TAKY POUŽÍT POUZE JAKO ROZŠÍŘENÍ NEBO PROPOJENÍ SYSTÉMŮ

UNIVERZÁLNÍ MODERNÍ ŘEŠENÍ BE + FE

Za myšlení, vývoj nástrojů a práci s nimi hodný 21. století
PRO VÝSTAVBU JAKÉHOKOLI 3vrstvého technologického softwaru nebo jeho částí

  • EasyITcenter - Univerzální multiplatformní serverové řešení MultiDatabase Backend s implementovanými všemi standardními technologiemi
  • EasySYSTEMbuilder - Univerzální moderní řešení Metro WPF Frontend System Builder pro rychlý a snadný vývoj jakéhokoli systému s minimálními znalostmi
  • Kombinované řešení - je jednoduché řešení pro rychlý vývoj jakéhokoli moderního systému,
    běží perfektně na připraveném System Core a šablonách pro Graphical/Click Development

Vývoj celého řešení jen založerním DB Tabulky a následně pomocí pouhého Kopírování a Přejmenování Šablon

EasyITcenter

Pro myšlení, vývoj nástrojů a práci s nimi hodné 21. století
Visual Studio C# projekt EIC ASP NETCORE6

Jednoduchý vývoj Universálního Zabezpečeného MultiDB MultiOS MultiLang Backend Serveru a násobně více
S implementacemi RESTFULL / WEBSOCKET

  • Se všemi typy šablon pro INSERT / UPDATE / DELETE / SELECT / PROCEDURE / SUBFORMDATA / atd.
  • S DATABÁZÍ, šablonou tabulky, šablonou Procerure, šablonou zobrazení,
  • Zálohování/obnovení/nastavení práv DB a další příklady
  • S tabulkami, indexy, cizími klíči ve všech standardních použitích DB

Vývoj API pomocí pouhého Kopírování a Přejmenování Šablon

EasySYSTEMbuilder

C# WPF Nízký/žádný kód řešení Pro okamžitý vývoj vašeho vlastního SYSTÉMU:

  • PRO KAŽDOU Společnost/Data Management/IS/OS/HW/Dotykobé Panely/Stroje
  • Podporována vícejazyčná aplikace WPF
  • Plná podpora pro tvorbu libovolného MS systému (moderní SAP atd.).
  • Řídicí systém s podporou grafů
  • Podpora jedinečného mediálního systému,
  • Podporovány dotykové terminály
  • Jsou podporovány dotykové terminály Business/City/Country/JAKÉKOLI na monitorech Windows AIO
  • Tisíce nástrojů na Github zdarma
  • Transparentní čistý kód
  • Vývoj bez či s minimální znalosti kódu - Vývoj Grafickými Nástroji, zaučení Orientace v knihovnách
  • Odkup Nových Agend do Centrálního Projektu
  • Vývoj a Implementace Nových Agend a Rozšíření Online
  • MultiJazyčná Dokumentace,
  • Vlastní WebServer pro Statické moduly
  • Přidružené Aplikace
  • Multi Web Server Pro Nativní a Reakční Web Aplikace
Standardizované Typy Šablon:    
DATAView / DATADetail / DATAView se SubDATAview / DATAView se SubFullDataDetail    
3D / Dokument / Video / Web    
    
1. Pro Tvorbu Jakéhokoliv informační / multimédia / Control/ Flow / reporting /Touch / Monitor / a dalších systémů    

Vývoj pomocí pouhého Kopírování a Přejmenování Šablon

#FYI Reporting - Report Designer / Viewer / Cmd
Zdarma Report Designer a Viewer pro tisk všech typů dokumentů / čárových kódů, EAN, QR


EASYTOOLS

  • Doplňky pro dotykové panely, ovládací prvky, datové typy, formuláře, média, dokumenty, 3D,
  • Jsou zcela zdarma ke stažení (součástí ESB OpenCode balíčku)
  • Github/Gitlab/Azure komunita pro zahrnutí více než 1000 nástrojů do systému podle komunity
  • Doplňky jsou upravené Github Projekty začlěněné jako Rozšíření

STÁVAJÍCÍ KLONOVÉ SYSTÉMY VYTVOŘENÉ ZA 14 DNÍ

  1. LicenseSrv
    MultiOS licenční server s naslouchajícím API GET/POST server / generování neomezených statických/dynamických licenčních KÓDŮ a aplikačního klienta pro správu serveru
  2. NÁVODY Windows XP+ Implementace produkčních zdrojů do výroby produkční společnosti Pro kancelářské / dotykové panely s neomezeným počtem klientů a možností tisku
  3. ShoPingER Windows XP+ více pobočkový systém nabídek/objednávky/fakturace s multimediálními soubory podporovanými neomezeným počtem klientů a možnostmi tisku
  4. LicenceShoper MultiOS License Server PLUS Windows XP+ více pobočkový fakturační systém [LicenseSrv + ShoPingER]

ŘEŠENÍ - KDE NAJÍT KOMPLETNÍ INFORMACE

Veškerou dokumentaci, licenci, případovou studii, ceník, média, informace pro vývojáře, nápovědu, manuály, informace o technologii, instalaci, obrázky, videa, soubory ke stažení atd. naleznete zde:

Úvod EIC&ESB-Globální IT Řešení na míru

EasyITcenter & EasySYSTEMbuiler - Globální Řešení vašeho IT Obecné Informace o Struktuře, vazbách a možnostech tohoto Unikátního Globálnho Řešení Celé oblasti IT až na malinké vyjímky.

Seznam nejprioritnějších Rozšíření Systému. Ty budou zaimlemetovány během 6 měsíců protože se tomu můžu věnovat jen ve volném čase. Nejen Itéčkáři v naší zemi se místo vzdělávání soustředí jak pěníze čerpat místo tvořit přidanými hodnotami své činnosti. Připraveno je jíž přes více jak 500 vylepšení. Stačí stahovat z Github.

Připravované Novinky,

Zde je seznam dalších chystaných funkcionalit, které posouvá vývoj.
To Hlavní Je přípravaWeb Portálu ONLINE s Vývojem kódu Mnanagovaným Centrálním Řešením.
to Nabízí Vždy aktializace po ruce Obosměrné rozšiřování Projektů a Centralizaci Agend.
Tím z tohoto řešení Bude Nejlevnější IT šeření Tak Rozsáhlého Charakteru.

  1. udělat 1x SP pro čištění zadaných tabulek agenda tabulek k čištění

DocServer

  1. Zprovoznit ExperDoc Editor a Viewer Pro Doc Server, potazmo pridat pravo zapisovat externistum
  2. VYTvořit AGendu Generování Dokumentace MD z Externích Zdrojů
  3. VYMYSLET Export Group/Menu SYSTEM do Dokumentace + Popisy s automatickou grafikou členění a rozklikem pro web

CHYBI cleneni grafické znázornení s popisy, vytvořit ze statickych nastroju jako Modul

  1. sjednotit template files a pridat typ, skupinu,

EasyITcenter

  1. SERVER backendcheck bude nastavovat user is online, a system vytvořit chat s uzivately.

  2. SYSTEM nastavit tooltip description i pro listbox

  3. dodělat github

  4. SYSTEM Generické Agendy Pro Uživatele bude vycházet z Dynamic API přes Universální Formulář bez nutnosti vytvaret formuláře - Pouhým Api a zaevidováním Vznikne nová Agenda

  5. vytvořit remote konzoli na server pro moznost instalace a stravy online ze systemu

  6. SPECHA udelat MikroWeby s moznosti + NODEJS.RUN a importit WEBY (GITHUB) ale uz zbuildene - BUDE NOVA AGENDA SERVER COMMANDS (s moznosti Startup) procesy v monitoru = AGENDA PROCESY SERVERU a moznost spustit runtime process s loginem Uzivatele a kdyz bude offline - proces shodim

  • podle typu procesu trvaly - docasny -zvazit volby StartCommand/InstallCommand/BuildCommand

RESENI PRO REACT NATIVE Standalone WEB SERVERS na vlastnich portech (nastroj pro Check OpenPortu) = MULTI WEB SERVER Řešení

vytvořit Server agendu Process Task s možností on Startup a zapínáním a vypínáním online

  1. SPECHA Zaimplementovat Server Mod Provider a podminit WebPortal a Server Funkcionality Timto Nastavenim
  2. do scheduleru přidat scripty + startcommand [procesy ukladat do runtimelistu] Vytvořit Novou Agendu Scripty
    • certifikát do složky server-web/certificate + script na generování pro LIN/WIN, AUTO zahrnout subdomény
  3. Zaimplementovat SSH
  4. dát SSH a FTP do plánovaných úloh
  5. dodelat sitemapu musí počkat na galerie/videa atd.
  6. Dodelat WebScrapScript a zaradit do nove agendy servers a takto se budou tvorit node, react atd, servery
    1. scripty portalu dat do lokalni tabulky - snizi pocet dotazu na DB
  7. Vytvořit monitoging volání API A dle toho přesunout tabulky do lokálních - API Statistika

EasySYSTEMbuilder

  1. SYSTEM udělat setting limit dataview 500, Ne pro číselníky , vyžádá si úpravu all api Get nepovinný lastcount,
  2. SYSTEM V datové přidat radek s inputy a multiselect Combo zobrazených dat pro filtraci v nastaveni pridat zobrazit filtry
  3. SYSTEM udělat panel utility Ping, opět ports, terminál, cmd, srv cmd, SQL, JS,HTML, CSS, MD, C# pro rychlé testy funkčnosti, HTML+JS+CSS pro generátory + select framework pro auto definici knihoven a stylu,
    Přehled runtime settings, tables, v nastaveni pridat on/off utility
  4. SYSTEM udělat left float panel poznamky
  5. SYSTEM nova AGENGA WEBSOCKET ENDPOINT Aby si mohli implementovat cokoliv na webu a přidat systémový CHAT,
  6. SYSTEM SEHNAT LEPSI kalkulačku
  7. SYSTEM dodělat static files a přidat typy: framework, subdomain, userfiles, eicproject, eiclibrary, esbproject, esblibrary ,JSlibrary, CSSlibrary SystemSharedStore,WebTool,WebObject, WebPage, Typy budou agenda s nastavením verzovani, autocleanu or move do storehistory. Nesmí tam být 2x

ATD.... + automaticky verzovat soubory při uložení. BUDE TO GLOBALNI FILE STORE

  • Centrální správa static files, zapínání verzovani pro typy, auto mazání old verzi, přesun old verzi do té lokální DB jako STOREHISTORYLOG s hromadnou operaci cleanu se zvoleným typem
  1. Vytvořit Generátor dokumentace z Descriptions Vybraných řídících Agend jako hromadnou operaci

  2. Vytvořit Globální Přepis Description a popisovaču slovo za slovo hromadná operace

  3. vytvorit k Datapohledu Agendu Seznam Příkazů - Např zavolat /ServerCoreTools/UploadMarkdownFromUrl a uložit jako novou dokumentaci

  4. dodělat vyhledávání ve všech DB dokumentacích pro Editory - Search Panel na listboxem Knihovny příkladů
    myšleno hledám funkci a najde ji v několika knihovnách - zafiltrovat seznam

  5. RYCHLE udelat volani autorefresh DB->DOC - planovana Uloha

  6. změnit názvy scriptů podle toho co dělají a vše co se vztahuje k dané funkcionalitě napsat v 1 scriptu nebude se to muset hledat a bude to na 1 místě SUPER, vytvořit náhledové okno u editorů pro zobrazení knihovny odebrat vkládání na konec. Globální Knihovna - už je ted WebLibrary VYtvořit Nové Menu "Knihovny" a přesunout tam DOC,WEB,CodeCopletion,Generátory ATD.

vše nasázet do globalscriptů a k tomu udělat nastavení info typu - Global-Only Page a druhý typ Anonymous-ROLE = Knihovny API, Generátorů, Objektů, Funkcionalit, Toolu, CSS, to lze pak vyuzit jak u portalu tak u static pages.

  1. HYPER vymyslet automatické přidání parametru výška řádku systému a automaticky přidat nastavení do kódu ADD) přidat: Nastavení Výchozí řazení Tabulek podle sloupců jako lokální Tabulku a API Requesty řadit dle nastavení s Uživatelem Null nebo Vybraným pro možnost nastavit to uživateli rozdílně mimo Parametry Systému

jinak tento parametr, nebo seznam parametrů by mohl být definovn v menu a daný form už by jen poslouchal a plně dynamicky nastaví něco[object with name] - parametrem (začít tvořit SYSTEM Generator)

ANO rozsirit Nastaveni tabulky o VYSKA RADKU (plus projit parametry) + SubAgendu Pole - kde nastavi format, zarovnani, a teoreticky by mohl Vygenerovat Formular i CS kod a dat ke stazeni DO ESB pro zalozeni noveho FORM pri zavadeni Tabulky Do Menu zde jiz jen stazeny kod editovat v nastrojich zda je ok a vlozit do projektu

RESENI AUTOMATICKEHO GENEROVANI AGEND V SYSTEMU

  1. HYPER zalozit Agendu Vyznamova/casto hledana slova pro Agendy jako ja si pisu v tascich SPECHA/HYPER jako ciselnik ukazatelu.

staci jednoducha tabulka s informacemi uzivatel/agenda/slovo

    1. Nastavení Globálních Stylů Systému pro Jednotný Vzhled bez nustnosti nastavování.
  1. Rozšířit Volby Nastavení Vzhledu např sudé/liché řádky Datapohledu v Selection Barvě
  1. System Vytvořit Datagrid Context menu - obshlahnout ze swap Builder E:\Projekty\MyGitHub\FreeProjects\LocalDB-MSSQL-IS-System-Generator
  2. vytvořit generator InfoTouchApp (možno i maui verzi pro mobily) se zobrazením jednoduchých html stránek s group/menu strukturou plus sipky tam/zpet menu = resení pro infopanely viz radnice panel

pro Generování Dotykových Panelů

KLON

  1. vyzkoušet konverzi xaml->html a system prenest na html Tak by se dal zkonvertovat celý Stávající Systém do Webu
  2. Vytvořit Generátor Update Obsahu Databáze se selectem tabulek a polí pro náhradu slov = Hromadná Operace

EIC&ESB

  1. aplikovat implementovane Updaty celem rozsahu Projektů, Styly, Šablony VS Existující Agendy, Upravit Filter na Auto Search Text Type

  2. dodělat dynamicke API z SQL

  3. Vytvořit agendu Nastavení k Docs, styly s uploadem, linky

  4. TODO slozky upravit na browsable, allowedOpen in browser, must be authorized Nova agenda TODO slozky upravit na browsable, allowedOpen in browser, must be authorized = SLOUCENA - Rozsirena agenda Browsable Path o Multiple Auth Role ci minimalni Uroven,Ignore for StaticTools(app.Use) = Resi Startup a pridelovani Globalnich nastroju

Auth se da blokovat i Moduly jako ServerApi - proverit duplicitni Aplikaci

  1. Galerie - Typ Video/Audio/Image/Other - + IMPORT/EXPORT hromadne operace Odložit Možná Bude Řešit StaticWebStore staci Agenga/Upload/Download + nastavení APi pro vyčet - Šablony Generátorů

  2. upravit hromadné operace - Typ Export/Import/Operace pro moznost I/O poli, datapohledu/html/

SystemOperation, pridat inputtype [none,int,bit,table,json,etc.], inputdefinition[name,tablestructure], a kdyz bude zobrazit generic popup pro vyplneni - pro operace se vstupy atd

  1. SPECHA Vytvořit a publikovat úkolovník NEWS Chyby jeste Generovani NEWS/Úkoly/ChangeLog do Dokumentace

  2. nová agenda controling - dynamické SQL + předpřipravené GrafFormy pro vlastní definice pohledů

  3. vytvořit Agendu osobní parametry uživatele - dynamický formulář zde si vybere zasílat zprávy atd, paramtry zadá správce v nové agendě s typem parametru - mixed enum + copy dynam param form, funkce link, email web atd - hosting

Agenda Parametry k Výběru = Zaimplementované Funkcionality Možnost Definování Vlastních Parametrů Pro Web = Key/Value

  1. sehnat sql convert to jiných typu sql
  2. Dodělat Ovladání Subserverů z Administrace

Provider

  1. Vytvořit agendu napoveda kodu s vlastnimi castmi kodu - codecompletention

  2. přidat Nástroj/Role zda Auth či Guest a Generovat Panel Nástrojů - Bude Součástí Dashboard Vývoje

  3. scaffolging přesunout do prázdného projektu pro DB [bude z něho regenetate Projekt] - řeší RYCHLOST přidat tam i moznost klientskych Generic DB a pouzivat jej jako Centralni Scaffold

  4. HYPER nová agenda TableBuilder - Rozšíření DB + vygenerování kódu API jen s volbou šablony (stále ta 1 RESTFULL, že )

  5. Generovat Licence pro Založení Webu, po Vypršení se web smaže

  6. Vymyslet stahovani předloh stranek v html completu: https://www.creative-tim.com/ tyto pak stačí zeditovat a jede se Bude Součástí Licence a Webu

  7. Nabídnout moje projekty githubu včetně předchopzí verze System generatoru SwapBuilder

  8. vytvorit zobrazeni struktur serverDbDiagram projekt a jejich rozpadů logiky pomoci CodeAnalysis a Statické knihovny diagramů

  9. pridat pole globalversion, customversion, solution(licsrv,docsrv,) a vytvořit, migration procedure která vyzobe rozdili, uloyi script do DB, povysi verze, upozorni na custom, tzn jeste migracni tabulky pro kazdeho klienta

  10. vytvorit rozpis struktury databáze a editor s volbou tabulek, s funkcí přidat nové pole - celá migracni logika rizena ze systému musi vzniknout rizeni rozvoje databáze

  11. Zařídit Azure Server a Přestěhovat řízení projektů na rychlé datové úložiště

  12. LayerJS Zoom umi nahledy html stranek a zoomove je otevre Zaimplementovat Do Noveho Portalu rizeni projektů

  13. SYSTEM Přenastavit seznam IT Nástroje a Manuály - Vypublikovat na Web v Novem Desktopu


StaticWebStore

  1. Routingem muzu treba image nebo html file nebo cokoliv poslat do takoveho layoutu ktery v sobe bude mit editor a nacte si dany soubor sam a tak muzu udelat staticky html editor pro subdomain file Statické Nástroje budou mít pevnou Routu a otevírat a ukádat budou přes StaticFileStore Requesty = Tvorba interaktivních nástrojů Webu - Implementace Popup Html Editoru atd..
  2. Ke scriptům udělat možnost zadání názvu nástroje a podle toho natahovat CSS a JS = Budou Staticke Vsechno -> udělat něco jako INIT a ten zkontroluje jestli je načtený popř ho načte = JINAK Vytvorit nastroj HLEDAT v JS/CSS třeba tridu - v dostuplnych podle Role a nabidnout k nacteni neexistujici CSS tridu nezdetekuji

WebPortal

  1. při načtení websettings uložit Datum načtení a vytvořit nový parameter jak často Refrešovat
  • lepší zaznamenavat TablesLogLastUpdate Pro vybrane TBL(agenda) a web se mrkne a dle toho si refresne dlouhodobe datasety - a nebo toto udelat pres centralni WebSocket = vytvorit Web knihovnu WebSocket
  1. SPECHA opravit volání API z web Editorů a editor přenést do WebAdmina Narovnat nastaveni Webmenu po odebranych nastrojich

a opravit kolizi TooList Variable

Když nikdo neocenil 400 nástrojů vygenerovaných na jediné stránce

    1. designer JS+CSS taky udělat s výběrem jako u knihovny a překlik
  1. Upozornit že má neuložené změny před Změnou na jinou Položku

  2. pro portal, zalozit agendy web backroundvideoList + option zvuku, mp3list


WebServer

  1. Přidat Novou Agengu: HTML Generátory: a v knihovně nachystat generování různých typů HTML bude i nástroj při tvorbě Statických webů, prezentačních stránek, statických stránek, Přehledů, dokumentace, partnerská příprava dat

ideálně 1 API volající HTML i JS část z šablony např metro, tím je dáno CSS a bude tam zacílení na název tabulky tím to vrátí Data a centralizovaná šablona HTML - dlaždice, nebo combobox, takže tabulku+(pole: id,name,desc,link,icon,timestamp)+šablonu HTML/JS - takže vytvořit HTML/JS agendu šablony a globální funkci, která z toho vytvoří generátor Webu.

možná by stačil jen našeptávač šablon z Universal Editoru

  1. Udělat sloučený Export vybraných knihoven jako StartuUp Script CSS
    v návaznosti na existzující static nástroje, knihovny , frameworky, atd, ze kterých si složí nový static web či Šablonu pro portal???? - musi počkat na dynamické šablony
  2. Prenest Sablony Html Souboru z Razor do Agendy pro uplnou spravu - Dynamické CSHTML Šablony
  • zrusit agendu includovane scripty ze sablon, - budou si udrzovat sablony
  • takto: vytvořit agendu nastroju a k nim templaty v ni budou i editory a nastroje
  • Kazdy Layout bude mit svoji Page a to bude platne i pro portaly
  • PS: portalum dat index znacku a dovolit jich neomezene A k nim Sablony Stranek a tak pujde delat nastroje s Menu Atd, vazba musi byt zapsana v nich Ukladat je stejne jako portal scripty jsou potreba pro build serveru = dynamicke programovani
  1. import scriptů ze souborů do DB / export scriptů z DB so souborů - hromadná operce bude v Agendě Správa Statických Nástrojů ATD

  2. GUEST Okno HTML + JS + CSS at si vyzkousi skladat stránku s možností Exportu Galerie atd

  3. Web CodeControl bud vyuzit nejaky nastroj JS jak mam pro C# a generovat ListLog Promenych - U portalu s nastavenim Object Reload Davat vse do Try nevo analyzovat Let/Var/Const Name

  4. Udělat zálohování scriptů/ Import Složky muze byt Soucasti History Logu do LocalDB

  5. JEDNODUCHE Export Web Reseni mit moznosti jako Normal či Minify

  6. StaticWeb i MultiWebServer by mohly mít direct Clon z Githubu Otázka Bordelu node-modules - snad příkaz pro smazání.

Ideálně Podporovat pouze Statické Weby, nevracet se omezenému buildu se stejnými funkcemi

  1. ke každému subdomain website moznost zalozit localDB co je nachystany
  2. Napsat Dokumentaci Webu STATIC TECHNOLOGY s možností vyseparovat libovolnou funkcionalitu a kdekoliv kdykoliv nasadit online

Úvod EIC&ESB-Globální IT Řešení na míru

EasyITcenter & EasySYSTEMbuiler - Globální Řešení vašeho IT Obecné Informace o Struktuře, vazbách a možnostech tohoto Unikátního Globálnho Řešení Celé oblasti IT až na malinké vyjímky.

Seznam a popisy automatických funkcinalit a pravidel, nakteých stojí bezobslužnost spousty jinak nutných úkonů při vývoji. Tyto pravidla zajišťují Velmi snadný a rychlý vývoj

EASY-SYSTEM-Builder & EASY-DATA-Center & Visual Studio Help


OS GIT WINDOWS LINUX MARKDOWN DOC SCHEMA DATABASES

  • target of the new Groupware Solutions is set Maximal processes to this automatic solutions.
  • Result Will Be: Create Table and Set API Template - its Done for DATABASE and Backend API
  • Create Form from Templates In FrontEnd for the New Table - Its Done for New System Form (Agenda)
  • Share With World : World will share Agendas with you also
  • Agenda is Only 3 files: SQL(Table), API, FORM
  • Ideal Copy Class from generated By Scaffold to final Form
  • Its Absolute Perfect Solution For EASY Create Robust System in Few Months
  • All Systems Supported: Machines Control, IS Systems, Terminals, and All Sub Systems

Databáze Pravidla

  • Pojmenovávání a pravidla pri tvorbě databáze
  • zajišťují snadný přenos sktuktury od DB dat přímo k Formuláři
xxxList  -  Tabulka braná jako Systémová promítá se do:[Api,AppMenu,Tisky,]    
xxxSupportList - Tabulka podřízená nepromítá se do [AppMenu,Tisky] ale má API    
    


Visual Studio Automatic MD File From XML Comments

  • Install 'Vsxmd' Library
  • add this code to 'PropertyGroup' in project file setting
<GenerateDocumentationFile>True</GenerateDocumentationFile>    
<DocumentationMarkdown>$(MSBuildProjectDirectory)\Golden.md</DocumentationMarkdown>    

Visual Studio Automatic Code Cleaning

  • Install 'codemaid' Tool

Visual Studio Automatic DataBase Schema Snapshot

  • Install 'EntityFrameworkCoreScaffolding' Tool
  • Use Example file 'scaffoldingsettings.json' for OneClick Snapshot

GitHub Automatic MDBook

  • Enable 'MDBook' tool For Code
Use File: book.toml    

GitHub/GitLab Automatic Publish to GCloud Docker

  • Enable Build
Use File: Dockerfile    

GitHub/GitLab Automatic Publish to GCloud Docker

  • Enable Build
Use File: gitlab-ci.yml    

Linux Create Backend System Service for Automatic Control

  • Read OS support
Use File: Linux-dotnet-MyProject-service.service    

Windows Install application.exe as System Service for Automatic Control

  • Read OS support
Use File: install.bat    

Visual Studio Automatic Generate windows Help File chm

  • Install 'GhostDoc' tool
  • Run on Project for Generate Full Code COmment and Structure Help file

MSSQL DATABASE Automatic BACKUP/RESTORE

  • Use files from MSSQL_DB
  • Can run from System Scheduler
  • Can Run from SQL command

Backend WebPages Automatic Controller from Pages Structure

  • Enable Razor WebPages Engine
  • Create new file 'cshtml' in folder ServerCorePages
  • Page is automatic included to Controller !must we different than API URLS

Cloning Database Schema To More instances from One Source FOR using

  • Test / Dev / Sharp instances
  • more Branches
  • New Cloned System

MarkDown Item Template

    

Úvod EIC&ESB-Globální IT Řešení na míru

EasyITcenter & EasySYSTEMbuiler - Globální Řešení vašeho IT Obecné Informace o Struktuře, vazbách a možnostech tohoto Unikátního Globálnho Řešení Celé oblasti IT až na malinké vyjímky.

Zde jsou Globální kódy a funkcionality pro Centralizované používání

DATABASES on Modern way - finally

One Command and One Database in Project, never less - its my new Idea

Possible DB Technologies for immediately using by start click only

ALL MAIN DATABASE TYPES IN Golden by EF6 (entity framework) are supported

ORACLE    
MSSQL    
MYSQL    
POSTGRESQL    
SQLITE    
DB2    
etc    

SHARED PROJECT FILES

MSSQL EASYBuilder DB installation script


MSSQL ENGINE HELP COMMANDS AND TYPES

#Run stored procedure for Backup Database via MSSQL user login    
sqlcmd -U ,username -P password -S .\SQLEXPRESS -d DatabaseName -Q "EXEC DB_BACKUP"    
#Run stored procedure for Backup Database via Windows Login    
sqlcmd -S .\SQLEXPRESS -d DatabaseName -Q "EXEC DB_BACKUP"    
#Recovery Database via MSSQL user Login and set Right for Database by running stored procedure 'DB_SETRIGHTS    
sqlcmd -U username -P password -S .\SQLEXPRESS -Q "ALTER DATABASE [LICENSESRV] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;RESTORE DATABASE [LICENSESRV] FROM DISK = N'C:\Database\DEFAULT_DATABASES\LICENSESRV.bak' WITH MOVE N'LICENSESRV' TO N'C:\Database\LICENSESRV.mdf',  MOVE N'LICENSESRV_log' TO N'C:\Database\LICENSESRV_log.ldf', FILE = 2,RECOVERY,  REPLACE,  STATS = 10;ALTER DATABASE [LICENSESRV] SET MULTI_USER;"    
    
sqlcmd -U username -P password -S .\SQLEXPRESS -d LICENSESRV -Q "EXEC DB_SETRIGHTS"    

DATABASE Templates and System Rules COPY/PASTE/RENAME supported

For thinking, the development of tools and work with them worthy in the 21st century

  • The displayed template codes can also be found in the Database
  • Make the database model as honest as possible in relation to data and bindings
  • The best solution is to have the database check the correctness of the data (in 1 place)
  • The database contains a DBHELP help procedure
  • Document items are deleted with a linked key
  • Procedures for Backup/Restore are prepared in the DB
  • The system uses SLQ, EF6, Procedures, Views, Functions
  • That's all it takes to discharge
-- The procedure setting the rights for the user to the necessary operations    
    
USE [EASYBUILDER]    
GO    
SET ANSI_NULLS ON    
GO    
SET QUOTED_IDENTIFIER ON    
GO    
    
CREATE procedure [dbo].[DB_SETRIGHTS]    
AS    
BEGIN    
 BEGIN TRY CREATE USER [easybuilder] FOR LOGIN [easybuilder] END TRY BEGIN CATCH END CATCH;    
 BEGIN TRY ALTER ROLE [db_datareader] ADD MEMBER [easybuilder]; END TRY BEGIN CATCH END CATCH;    
 BEGIN TRY ALTER ROLE [db_datawriter] ADD MEMBER [easybuilder]; END TRY BEGIN CATCH END CATCH;    
 BEGIN TRY GRANT EXECUTE TO [easybuilder]; END TRY BEGIN CATCH END CATCH;    
END;    
GO    
/*    
Template for creating standardized Tables (from Table -> CREATE TO)    
The template is used by way of REPLACE 'TemplateList' after 'NewTableList'    
edit fields correctly, set indexes and foreign keys    
System ID Columns - AutoIncrement, TimeStamp - InsertTime    
Keys: UserId - Binding to the UsersList Table    
*/    
USE [EASYBUILDER]    
GO    
SET ANSI_NULLS ON    
GO    
    
SET QUOTED_IDENTIFIER ON    
GO    
    
CREATE TABLE [dbo].[TemplateList](    
 [Id] [int] IDENTITY(1,1) NOT NULL,    
 [Name] [varchar](50) NOT NULL,    
 [Description] [text] NULL,    
 [Default] [bit] NOT NULL,    
 [UserId] [int] NOT NULL,    
 [Active] [bit] NOT NULL,    
 [TimeStamp] [datetime2](7) NOT NULL,    
 CONSTRAINT [PK_TemplateList] PRIMARY KEY CLUSTERED    
(    
 [Id] ASC    
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY],    
 CONSTRAINT [IX_TemplateList] UNIQUE NONCLUSTERED    
(    
 [Name] ASC    
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]    
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]    
GO    
    
ALTER TABLE [dbo].[TemplateList] ADD  CONSTRAINT [DF_TemplateList_Active]  DEFAULT ((1)) FOR [Active]    
GO    
    
ALTER TABLE [dbo].[TemplateList] ADD  CONSTRAINT [DF_TemplateList_TimeStamp]  DEFAULT (getdate()) FOR [TimeStamp]    
GO    
    
ALTER TABLE [dbo].[TemplateList]  WITH CHECK ADD  CONSTRAINT [FK_TemplateList_UserList] FOREIGN KEY([UserId])    
REFERENCES [dbo].[UserList] ([Id])    
GO    
    
ALTER TABLE [dbo].[TemplateList] CHECK CONSTRAINT [FK_TemplateList_UserList]    
GO    
/*    
System procedure for Reports with advanced Filtering    
The procedure is part of the Supplied Database    
*/    
USE [EASYBUILDER]    
GO    
    
/****** Object:  StoredProcedure [dbo].[ReportDataset]    Script Date: 11.03.2023 6:45:06 ******/    
SET ANSI_NULLS ON    
GO    
    
SET QUOTED_IDENTIFIER ON    
GO    
    
    
CREATE PROCEDURE [dbo].[ReportDataset]    
@TableName varchar(50) = null,    
@Sequence int = 0    
AS    
BEGIN    
 -- SET NOCOUNT ON added to prevent extra result sets from    
 -- interfering with SELECT statements.    
 SET NOCOUNT ON;    
    
-- Intended for use with param-ed reports.    
-- To be called from various My-FyiReporting reports    
--   - Various reports with their own layouts are called from VB app after setting Queue with usp_ReportQueue_Push()    
--     each report then just contains :    
    
-- SET FMTONLY OFF;    
-- EXEC usp_ReportQueue_Pop @TableName='SomeTablename', @Sequence='10'    
--    
    
DECLARE @ID int;    
DECLARE @NAME varchar(50);    
DECLARE @SQL nvarchar(MAX);    
DECLARE @FILTER nvarchar(MAX);    
DECLARE @SEARCH varchar(50);    
DECLARE @SEARCHCOLUMNLIST nvarchar(MAX);    
DECLARE @SEARCHFILTERIGNORE bit;    
DECLARE @RECID varchar(50);    
DECLARE @RECIDFILTERIGNORE bit;    
    
DECLARE @SEPARATEDCOLUMNS nvarchar(MAX);    
    
    
SELECT Top 1    
  @ID=[Id],    
  @NAME=[Name],    
  @SQL=[Sql],    
  @FILTER=[Filter],    
  @SEARCH=[Search],    
  @SEARCHCOLUMNLIST=[SearchColumnList],    
  @SEARCHFILTERIGNORE=[SearchFilterIgnore],    
  @RECID=[RecId],    
  @RECIDFILTERIGNORE=[RecIdFilterIgnore]    
FROM ReportQueueList WHERE [TableName]=@TableName AND [Sequence] = @Sequence;    
    
--PRERARE RECID    
IF (@RECID = 0 OR (@RECIDFILTERIGNORE = 1 AND @FILTER <> '1=1')) BEGIN    
 SET @RECID = ''    
END ELSE BEGIN    
 SET @RECID = CONCAT(' AND Id=',@RECID);    
END    
    
--PRERARE SEARCH    
IF (@SEARCH = '' OR (@SEARCHFILTERIGNORE = 1 AND @FILTER <> '1=1')) BEGIN    
 SET @SEPARATEDCOLUMNS =  '1=1';    
END ELSE BEGIN    
 SELECT @SEPARATEDCOLUMNS = STRING_AGG (CONCAT(value,' LIKE ',char(39),'%',@SEARCH,'%',char(39)), ' OR ') FROM STRING_SPLIT (@SEARCHCOLUMNLIST, ',');    
END    
    
 SET @SQL = CONCAT(@SQL,' WHERE 1=1 AND (', @FILTER,') AND (', @SEPARATEDCOLUMNS,') ',@RECID);    
 --PRINT @SQL; --FOR Debuging    
 EXECUTE sp_executesql @SQL;    
END    
GO    
--SQL Trigger pro Tabulku pro nastavení jediné hodnoty u typu 'Default'    
USE [EASYBUILDER]    
GO    
    
/****** Object:  Trigger [dbo].[TR_UnitList]    Script Date: 11.03.2023 6:48:06 ******/    
SET ANSI_NULLS ON    
GO    
    
SET QUOTED_IDENTIFIER ON    
GO    
    
CREATE   TRIGGER [dbo].[TR_UnitList] ON [dbo].[UnitList]    
FOR INSERT, UPDATE, DELETE    
AS    
DECLARE @Operation VARCHAR(15)    
    
IF EXISTS (SELECT 0 FROM inserted)    
BEGIN    
 DECLARE @setDefault bit;DECLARE @RecId int;    
 SET NOCOUNT ON;    
    
    IF EXISTS (SELECT 0 FROM deleted)    
    BEGIN --UPDADE    
  SELECT @setDefault = ins.[Default] from inserted ins;    
  SELECT @RecId = ins.Id from inserted ins;    
    
  IF(@setDefault = 1) BEGIN    
   UPDATE [dbo].UnitList SET [Default] = 0 WHERE Id <> @RecId;    
  END    
 END ELSE    
  BEGIN -- INSERT    
   SELECT @setDefault = ins.[Default] from inserted ins;    
   SELECT @RecId = ins.Id from inserted ins;    
    
   IF(@setDefault = 1) BEGIN    
    UPDATE [dbo].UnitList SET [Default] = 0 WHERE Id <> @RecId;    
   END    
    
  END    
END ELSE    
BEGIN --DELETE    
 SELECT @setDefault = ins.[Default] from deleted ins;    
 SELECT @RecId = ins.Id from deleted ins;    
    
 IF(@setDefault = 1) BEGIN    
  UPDATE [dbo].UnitList SET [Default] = 1    
  WHERE Id IN(SELECT TOP (1) Id FROM [dbo].UnitList WHERE Id <> @RecId)    
  ;    
 END    
END    
GO    
    
ALTER TABLE [dbo].[UnitList] ENABLE TRIGGER [TR_UnitList]    
GO    

MarkDown Item Template

    

Úvod EIC&ESB-Globální IT Řešení na míru

EasyITcenter & EasySYSTEMbuiler - Globální Řešení vašeho IT Obecné Informace o Struktuře, vazbách a možnostech tohoto Unikátního Globálnho Řešení Celé oblasti IT až na malinké vyjímky.

Seznam Implementovaných Nástrojů , modulů, řešení třetích stran. V konfiguracích je použito s bídou 5% možností daných nástrojů. Prodalší rozšíření jsou zde Odkazy na Dokumentace Daných Nástrojů. Pro Automatický Překlad Si stáhnetě dokumentaci do Statického úložiště a nasaďte Modul Automatického Překladu.

EIC Implementované Moduly


ESB Implementované Moduly


Úvod EIC&ESB-Globální IT Řešení na míru

EasyITcenter & EasySYSTEMbuiler - Globální Řešení vašeho IT Obecné Informace o Struktuře, vazbách a možnostech tohoto Unikátního Globálnho Řešení Celé oblasti IT až na malinké vyjímky.

Changelog jsem začal prat teprve ted. Každý úsek který vidíte, je výsledkem 2dnů práce macimálně.
Pro představu co vše se dá zvládnout. Vyzkoušejte nebo požádejte o instalaci u vás ve firměš či doma a zkuste
vyzkoušet vo vše dané řešení nabízí.

Zpracovávané a zpracované Funkcionality,

Zde je vypsána ani setina toho co vše Dané projekty Umí.
Myslím že chystaný vývoj Online z Webu a Editorů mluví za vše. Tak neplýtvejte financemi na
čas zaměstanců či jiná řešení A Vyzkoušejte 30 denní verzu zdarma.

EasyITcenter

Hotovo

  1. udělat agendu emaillogger
  • Hotovo Loguje se do SolutionFailListu když je zapnutý Server Parameter ConfigLogWarnPlusToDbEnabled

EasySYSTEMbuilder

Hotovo

  1. SYSTEM pro enumy udělat tabulku kde skupina BUDE jen text - takto to půjde spravovat jedna tabulka pro všechny enumy
  • SUPER ŘEŠENÍ - už jste někdy viděli? Vyřešeno Agenda MixedEnumList spravuje Všechny male číselníky s popisy Významů/návodů jednotlivých Voleb Ty slouží zároveň jako automatická ToolTIP nápověda při vybírání ze seznamu

EIC&ESB

Hotovo

  1. Aktualizovat Dev News
  • Vyřešeno Task Agendou a generováním Úkolů A jejich Stavů plněním do Dokumentace Hromadnou Úlohou

Hotovo

  1. jednou provždy opravit TimeStamp Timestamp na TimeStamp
  • Vyřešeno, všechny nazvy se nove kontroluji vsechny .ToLower().

Hotovo

  1. Řešení SourceBrowser - upravit projekty, zaimplementovat, vygenerovat kódy a nasadit jako code documentace
  • Hotovo. Nyní součástí nového Portálu na API /EiC&ESBCodeBrowser/index/index.html

Hotovo

  1. Prenos Historie zmen z Doc Agendy do Task Agendy
  • Projects Legend

    ESB = EasySYSTEMbuilder
    EIC = EasyITcenter
    SD = EASYBuilderDataCenter SP = EASYBuilder application I = Install file DB = Database

Každá změna v EB/SP může být nasazena do druhého programu
Každá změna IN ED/SD může být nasazena do druhého programu

Instalační soubory projektu/programu jsou pro naprosto jednoduchou instalaci se všemi závislostmi Dokumentaci a software pro testování najdete na

https://groupware-solution.eu/webdav/Marketing/ přihlášení: marketing/marketing

 VŠECHNY aplikace připraveny pro jednoduchou instalaci / Koupit více typů instalace - podle uživatelsky přívětivého instalačního souboru a licenčního serveru

Aplikační klony FE + BE

 LicenseSrv - MultiOS licenční server s nasloucháním API GET/POST server / generování
                  Neomezené statické/dynamické KÓDY a klient pro správu
 PRŮVODKY - Implementace Windows XP+ Výrobní příručky pro produkční společnosti
                  Pro kancelářské / dotykové panely s neomezeným počtem klientů a možností tisku
 ShoPingER - Windows XP+ MultiBranch Nabídka/Objednávka/Fakturační systém s multimediálními soubory
                  Podporováno s neomezenými klienty a možnostmi tisku
 LicenceShoper - MultiOS License Server PLUS Windows XP+ MultiBranch Fakturační systém
                  [LicenseSrv + ShoPingER]

ŘEŠENÍ HLAVNÍ DÍLY

 EASYBuilder vyvíjí projekt C# WPF Visual Studio s nastavením nabídky MustiVariable,
  Se všemi typy šablon datových formulářů DATAView / DATADetail / With SubDATAview /
  S SubFullDataDetail / 3D / Dokument / Video
  pro sestavení JAKÝCHKOLI informačních / multimédií / řízení / toku / podávání zpráv a dalších systémů
  PRO DALŠÍ VÝVOJ KOPÍROVÁNÍ / VLOŽENÍ ZA EXTRÉMNĚ NÍZKOU CENU 5000Kč/200EURO - LICENCE projektu

 Golden - Univerzální bezpečný multiplatformní projekt backendového serveru MultiDATABASE
                  S implementacemi RESTFULL / WEBSOCKET
      Se všemi typy šablon pro INSERT / UPDATE / DELETE / SELECT /
      PROCEDURE / SUBFORMDATA a další Jiné
      S DATABÁZÍ, šablonou tabulky, šablonou procedury, šablonou zobrazení,
      Zálohování/obnovení a další příklady
      S tabulkami, indexy, cizími klíči ve všech standardních DB
      PRO DALŠÍ VÝVOJ KOPÍROVÁNÍ / VLOŽENÍ ZA EXTRÉMNĚ NÍZKOU CENU 5000Kč/200EURO - LICENCE projektu

 FYI Reporting - FreeWare Full Report Designer a Viewer pro tisk všech typů dokumentů
                  / Čárové kódy, EAN, QR, grafy, dílčí sestava atd.

SW Date Version Speed Development Description by one man Only

EB/SP/I  1.12.2022   1.5.78.925 Start of Developing steps describing
EB   1.12.2022    Added Link for FyiReportink 100 Examples to 
                                    Help_Commands
EB/SP/I  1.12.2022   1.5.78.944 Implemented DB Connection string to settings for All 
                                     Report as param, centralized
EB/SP  1.12.2022    Implemented new TreeView Menu for much more menu 
                                    items in Menu
SD/SP  1.12.2022    Implemented CurrencyList, UnitList, AddressList   
                                    ItemList Agendas
EB/SP  1.12.2022    Implemented Copy menu button for copy Each record in 
                                    listview
SD   1.12.2022               Describe existing API call to documentation
EB/SP  2.12.2022    Changed Settings for much more application menu Types   
                                    and implemented new Menu
EB/SP  2.12.2022 1.5.78.954 Publish new version EASYBuilder installers on 
                                    Google/WebDav/WebSite
EB/ED/SD/SP 2.12.2022               Publish Development Info on WebSite And Marketing 
EB/SP       3.12.2022               Repaired filtering on null values
EB/SP       3.12.2022               Centralized load Report List Control from ApiUrl 
                                    definition List for these addresses
SD   3.12.2022               Create TemplateList Table

to          15.12.2022             5 Applications Created IN  14 DAYS WITH 20-40 DB 
                                   tables / Agendas in ONE MAN ONLY 

2023.07.07 FAST REcapitulation

Exist Few Tasks For Better Settings Maily for EASY SYSTEM BUILDER (SET Full Automatic Translating for Example) But Yesterday Will Be Regenerated Older EDC & ESB Clones Over Automatized Solutions.

EDC now MULTI Server (GroupWare Solution) Has Own System Clone As Basic Server Manager - Any Interest of This Solution (its not normal) Server for Testing With Posible FUNCTIONalities most Than commercial Products I have Problem Find Normal Work as alone Developer

So in Week Will start The EASY-DATA-CENTER (Backend API from Start, but now + Media,Multi Web,FTP,Socket,DOCs,Emailing,HealthCheck, etc With Absolute News In WORLD) example: Remote Monitoring internal logger of Server over WebSocet, Automatic Translation Table Filler by First World Using in System and much more

So News Are In Video, New Full Agenda from DB to System is Finished in 5min - Copy Similar To 5 Hours - Complicated for More Joing Example OCR for Max 2 Days For Implmenent almost perfect Solution for HTML Editing with Allmost HTML shits and Fails in Format.

Perhaps Severu's Media Backend Generator, which will generate a RESTFUL API with a lot of other benefits, will awaken interest and I will finally find clients instead of mocking that I can't do IT.

PS: i Start IT on ATARI 65XE in 1989 and this Year is 33 Years from My First Program Code.

So Recap Solutions By Videos I Found Plan Implement Automatic LetsEncrypt for Server, Gihub Custom Server, cheap EDC Server Generator, Next Few cheap Generator which i build on this Way, ESB Generator, XAML Form Builder for EASY Build System By Clicking on Mouse.


05.12.23 Globální Změny

Vznikla první agenda s automaticky překládanými poli

Úkol, aktualizovat všechny existující aonliner agendy na automatický překlad

  • Automatický Překlad sbírá pomocí funkce "TranslateFormFields" všechny Popisky-LAbel typy a Button Tlačítka Typy a překládá je oproti DB překladovému seznamu

  • Odpadá nutnost vupisovat typy polí

  • POZOR toto je možné jen preo ONLINE AGENDY seznam je načítaný ze serveru

  • Další Varianta Překladu je pomocí ruční definice popisku z názvu

  • použije "fileType" pro překlad *DBOperations.DBTranslation(lbl_fileType.Name.Split('_')[1])

nebo přes lokální Slovníky "Languages" pro použití OffLine

  • lbl_fileType.Content = Resources["fileType"].ToString()
  • Menu je Celé kromě volby Nastavení Klienta zmeněno na automatický překlad DB slovníku

  • Odpadá nutnost kvůli nové online agendě importovat slovníky

  • Slovníky lze Generovat z Backendu a Vložit Do projektu Systému pro Offline Použití

  • Použité Jazyky CS,EN, neomezená možnost jednoduchého rozšíření Lang Tabulky


Starší Zápisy

Změny ve volných chvílích při zaměstnání 12.2023 - Nestačím Zapisovat https://KlikneteZde.Cz 30.12 Generic API , nyní stačí registace názvu nové tabulky do příslušné Skupiny Dle Práv 29.12 Agenda Dynamické Moduly a Služby [custom HTML/CSS/JS API moduly] + Sekundární Zabezpečení API 28.12 Připraven Interface pro DBWebStatic FileStructure 27.12 Agenda Static WebSites - další webstránky na subdoménách url://website.domain.xx nebo url://domain.xx/website 26.12 Agenda Operace Systému - DB SP operace, Import/Export/Backup/Clone/Generate Docs/Generate DB Object atd.. 24-27.12 STATIC WEB Studio https://kliknetezde.cz/server-web/static-web-studio/ - prezentační fáze pro Global Administrátor 23.12 Předělána Agenda ServerSetting do Dynamic Form, nová nastavení automaticky přiskočí

9.1 po změnách Změna Klient Setting na Generic Form + MultiSameTab + MultiInstanceCloneByDrag

09.12.2023 ESB - Implementován SystemMenu ToolTip Dle Param nastavení, zobrazen Popisek menu ESB+WEB - Imlementována Agenda Správa globálních HTML, a Finálně převeden Layout do DB správy Web je Nyní Plně v Režii DB a je Skládán z částí HTML Globální + Stánka z Editoru dle Práv v nastavené sekvenci

19.04.24 Globální Změny

  • částečné narovnání FulText Dokumentace
  • Vytvoření Agendy Úkoly a Zápis všech poznamenaných Cílů
  • rušení angličniny v dokumentaci, vracení do CZ, Je Překládána Automaticky


Provider

Hotovo

  1. kompletní dokumentace a zobrazeni mermaidů, pro Server, System, DB, WEB static tools, webFunctions Library-API-behavior-object atd, s popisi , rozložením, atd..
  • Hotovo Nový Dokument Portal s Auto Překladačem veškerého Obsahu. Nyní jen Dopsat a Udržovat v Administraci

WebPortal

Hotovo

  1. každý script by měl mít části guest/webuser/admin/provider aby se načítaly jen ty správné
  • Zaimplementovano Dle pozadavku ve SPA Stránce WebPortálu

Metody Přírustkové, nebo Přepis, Provider se natahuje vždy


WebServer

Hotovo

  1. udělat třídu co doplní ikonu COPY a PRINT zaramuje objekt
  • Vyřešeno Globalni Funkce, Copy/Print/ExportAsHtml/ExportAs Image/ExportAsPdf

Hotovo

  1. minifikace JS/CSS bude operace nebo ať ti to udělá sám
  • Vyřešeno Nastavením Minify WebPortal Se provede pro Static Existuje MinifyApi

Hotovo

  1. zkusit zaimplementovat astnetstatic pro export webu jako staticky i s daty a vyexportovat soucasny portal
  • Už netřeba WebPortal, všechny Doplnky, nástroje, Tooly, UI, Frameworky, Dashboardy jsou plně statické. Stačí Obyčejné vykopírování Souborů

Database

Provádí se

  1. Projít DB a dodat do všech/vybraných tabulek description - Slouží jako Auto help pro systém i generování webu

EasySYSTEMbuilder

Provádí se

  1. SYSTEM sjednotit APP konfiguraci jako na Backendu

Provádí se

  1. SYSTEM v nekterych setrecord - Chybi TRY chatch

Provádí se

    1. v systému řešení tooltipů, vyzobat všechny descriptiony k záznamům, nadřazených skupin atd, a osnovou je vyskládat, a vlevo nahoře pridat ikonu INFO
  1. Opravit zobrazení jen pro aktuálně zobrazené okno, zobrazuje ToolTipy i ostatních otevřených Oken
    1. Hotovo. Ikona ShowAllToolTips Zobrazí Všechny Nápovědy definované v Otevřených oknech

WebPortal

Provádí se

  1. přidat do stránek OpenDocView jak je na Nomadu

Chybí vazba na WebMenu + ikonka Fixed, top, right pro zobrazeni

  • Agenda WebInfoPanely jsou Panely pro návody jednotlivých WebMenu

WebServer

Provádí se

  1. Založit a naplnit JS Knihovny:
  • Funkce

  • Objekty

  • Generátory

  • Knihovny

  • Nástroje

  • Úložiště

  • ObjektControllery

  • Okna

  • Panely

  • Stránky


EasySYSTEMbuilder

Vylepšování

    1. zapnout možnost otevřít 1 okno vícekrát, rozdělit do více instancí
  1. Přesunout nastavení Do parametrů ať cestuje s uživatelem
  • Hotovo volba nastavení Systému umožnuje otevřít stejné okno vícekrát, pro možnost dívat se na jiná data.

EIC&ESB

Vylepšování

    1. Převzít hotel HTML messaging, přidat changelog,
  1. Vytvořit Knihovnu pro WEB
  2. Přidat group-users-blog,Task Request-Blog,Rss-News,Web-Socket Messaging, Web-Socket Blog
    1. Převzato v Systému, Novinky, Blog, Privatni zprávy

WebServer

Vylepšování

    1. vytvořit layout s překladačem a modulům dát možnost volby layoutu
  1. Vytvořit InjectPages pro nastroje, ktere si soubor nacitaji sami, tim neodpovi static Web ale nastroj
  • Hotovo Vytvořen Modul /PrintPageModuleList kde Preklad je Vygenerovan Scriptem

Úvod EIC&ESB-Globální IT Řešení na míru

EasyITcenter & EasySYSTEMbuiler - Globální Řešení vašeho IT Obecné Informace o Struktuře, vazbách a možnostech tohoto Unikátního Globálnho Řešení Celé oblasti IT až na malinké vyjímky.

Neomezená možnost vývoje, pomoci, spolupráce, či cokoliv jiného jek dispozici. Každá spolupráce je pro mne přínosem

Ceník a Licencování EIC-ESB Řešení

EASY-IT-CENTER & EASY-SYSTEM-BUILDER
Pro myšlení, vývoj nástrojů a práci s nimi hodné 21. století

Runtime Edice

Kč 35000  EITC-ESB Limited     = Kompletní Řešení bez Sub Serverů: GIT,DOC,TaskMan,...    
a Provider Funkcionalit    
    
Kč 50000  EITC-ESB Extended  = Kompletní Řešení včetně Sub Serverů: GIT,DOC,TaskMan,...    
bez Provider Funkcionalit    

Developer Edice

Kč 75000  EITC-ESB OpenServer  = Kompletní Řešení s Uvolněným Kódem EIC pro vlastní Vývoj    
v neomezeně Instancích pro Interní potřeby Firmy bez Provider Funkcionalit    
    
Kč 75000  EITC-ESB OpenSystem = Kompletní Řešení s Uvolněným Kódem ESB pro vlastní Vývoj    
v neomezeně Instancích pro Interní potřeby Firmy bez Provider Funkcionalit    
    
Kč 100000 EITC-ESB OpenCode  = Uvolněny kódy EIC-ESB pro vlastní Vývoj    
v neomezeně Instancích pro Interní potřeby Firmy bez Provider Funkcionalit    

Distributor Edice

Kč 250000 Partnerství a Distribuce  = Plný přístup ke všem Kódům pro Vývoj Vlastní Cestou,    
spolupartnerství při vývoji, udávání směru a priorit, bez Provider Funkcionalit, Distribuce Třetím Stranám    
    
Kč 750000 Odloučený Vývoj            = Plný přístup ke všem Kódům pro Vývoj Vlastní Cestou    
včetně Provider Funkcionalit,Project Managementu, Distribuce Třetím Stranám, atd...    

Školení

Kč 30000/Tyden EITC-ESB DevTraining = 2dny Kompletní Představení produktů,    
1 den Zaučení vývoje, poslední 2dny BONUS tvorba vlastních MS/Web Agend    

Update/Podpora

Kč 15000/rok EITC-ESB MainTenance      = K dispozici unlimited aktualizace, Online Správa Projektů, AutoUpdate/AutoRepair    
Kč 1500/hod EITC-ESB RemoteSupport  = Online Tel/Remote podpora    

IT Vývoj Ostatní

Kč 750/hod Vývoj / Konzultace / Podpora   = Spolupráce, Vývoj Jiných Produktů, řešení, Zakázkové práce,    

Příklad Cenové Náročnosti

  1. VYBUDOVÁNÍ MALÉHO VLASTNÍHO SYSTÉMU (5 Tabulek [Výkazy Práce])
    od 20 000 Kč nebo hodinově 750 Kč/hod
  2. VYBUDOVÁNÍ VLASTNÍHO SYSTÉMU (20 tabulek)
    od 40 000 Kč nebo hodinově 750 Kč/hod
3. Fakturační Systém včetne MultiPoboček/Nabídek/Objednávek/Pokl.Dokladů/Dobropisů/Faktur (40Tabulek)    
časová náročnost byla 14dní  ve starých verzích EDC - ESB viz: Agenda Obchodu v SYSTEMU    
včetně generování spřažených dokladů,    

Úvod EIC&ESB-Globální IT Řešení na míru

EasyITcenter & EasySYSTEMbuiler - Globální Řešení vašeho IT Obecné Informace o Struktuře, vazbách a možnostech tohoto Unikátního Globálnho Řešení Celé oblasti IT až na malinké vyjímky.

Kontakty

Adresa a Kontakty

Email:

  • Libor.Svoboda@GroupWare-Solution.eu
  • Libor.Svoboda@KlikneteZde.Cz

Address:
Street: Žlutava 173
City: Žlutava
PostCode: 761 63
State: Czech Republic
Phone: 00420 724 986 873


Úvod Start -DATABASE-RULE

Vše začíná U databáze. Pravidla určující MultiLogiku v 1 Balíčku. Zde najdete Kompletní Strukturu Aktuální Databáze a Seznam Pravidel, které je obecně dobré dodržovat

1 pravidlo: Každé slovo má Hluboký Význam

Seznam a popisy automatických funkcinalit a pravidel, nakteých stojí bezobslužnost spousty jinak nutných úkonů při vývoji. Tyto pravidla zajišťují Velmi snadný a rychlý vývoj

Členění Webu EIC Serveru

Pro myšlení, vývoj nástrojů a práci s nimi hodné 21. století

Podívejte se čerstvě Vydaný Dokumentační Portal komlpet v Češtině.

Díky implementovanému AUTO překladači se už nestane že něčemu neporozumíte.
Protože Správné porozumění je nejčastější Kámen Úrazu u tolik Trpících Dokumentací.
Psát Dokumentaci je totiž horší než vývoj.

  1. Dokument Portal ANY LANG

  2. MS System Builder Online na Webu

  3. Web Portal tvořený již nyní Editorem v Systému

  4. Fultextová Dokumentace EIC&ESB Projektů

  5. Prohlížeč Projektů EIC&ESB Online

Věřím, že budete mít zajímavou podívanou co se dá nachystat ve volném čase v 1 Měsíci.


Plánované Implementace Řešení EIC&ESB

  1. SYSTEM udělat setting limit dataview 500,
    Ne pro číselníky , vyžádá si úpravu all api Get nepovinný lastcount,

  2. SYSTEM V datové přidat radek s inputy a multiselect Combo zobrazených dat pro filtraci v nastaveni pridat zobrazit filtry

  3. SYSTEM udělat panel utility
    Ping, opět ports, terminál, cmd, srv cmd, SQL, JS,HTML, CSS, MD, C# pro rychlé testy funkčnosti, HTML+JS+CSS pro generátory + select framework pro auto definici knihoven a stylu,
    Přehled runtime settings, tables, v nastaveni pridat on/off utility

4)SERVER backendcheck bude nastavovat user is online, a system vytvořit chat s uzivately.

  1. SYSTEM udělat left float panel poznamky

6)SYSTEM AGENGA WEBSOCKET ENDPOINT
Aby si mohli implementovat cokoliv na webu a přidat systémový CHAT,

6b) add bod 10) FILES + k files udělat agendu user Static files s možností nastavit sdílení, verzovani = files flow + přidat do agend selekci souboru tento zdroj = USER FILE STORE

  1. SYSTEM SEHNAT LEPSI kalkulačku

  2. SYSTEM nastavit tooltip description i pro listbox

  3. SYSTEM log přidat enum Task/Log a mazat jen logy

  4. SYSTEM dodělat static files a přidat typy: framework, subdomain, userfiles, eicproject, eiclibrary, esbproject, esblibrary ,JSlibrary, CSSlibrary
    SystemSharedStore,WebTool,WebObject, WebPage,
    Typy budou agenda s nastavením verzovani, autocleanu or move do storehistory. Nesmí tam být 2x

ATD.... + automaticky verzovat soubory při uložení. BUDE TO GLOBALNI FILE STORE

  • Centrální správa static files, zapínání verzovani pro typy, auto mazání old verzi, přesun old verzi do té lokální DB jako STOREHISTORYLOG s hromadnou operaci cleanu se zvoleným typem
  1. dodělat github

12)SYSTEM Generické Agendy Pro Uživatele bude vycházet z Dynamic API přes Universální Formulář

  1. Zprovoznit ExperDoc Editor a Viewer Pro Doc Server, potazmo pridat pravo zapisovat externistun

  2. Vytvořit Generátor dokumentace z Descriptions jako hromadnou operaci

  3. Vytvořit Globální Přepis Description a popisovaču slovo za slovo

  • Routingem muzu treba image nebo html file nebo cokoliv poslat do takoveho layoutu ktery v sobe bude mit editor a nacte si dany soubor sam
    a tak muzu udelat staticky html editor pro subdomain file

  • Přidat Novou Agengu: HTML Generátory: Ya v knihovně nachystat generování různých typů HTML
    bude i nástroj při tvorbě Statických webů, prezentačních stránek, statických stránek,
    Přehledů, dokumentace, partnerská příprava dat

  • vytvořit remote konzoli na server pro moznost instalace a stravy online ze systemu

  • dodělat dynamicke API z SQL

  • dodělat vyhledávání ve všech DB dokumentacích pro Editory - Search Panel

  • Udělat sloučený Export vybraných knihoven jako StartuUp Script CSS

  • Vytvořit agendu Nastavení k Docs, styly s uploadem, linky

  • Vytvořit agendu napoveda kodu s vlastnimi castmi kodu - codecompletention

  • VYTvořit Gendu Generování Dokumentace MD

  • Vytvořit Agendu Generátory pro Web Portal a stranku skladat i z Generátorů

  • Prenest Sablony Html Souboru z Razor do Agendy pro uplnou spravu

    • zrusit agendu includovane scripty so sablon, - budou si udrzovat sablony
    • takto: vytvořit agendu nastroju a k nim templaty v ni budou i editory a nastroje
    • Kazdy Layout bude mit svoji Page a to bude plate i pro portaly
    • PS: portalum dat index znacku a dovolit jich neomezene
      A k nim Sablony Stranek a tak pujde delat nastroje s Menu Atd, vazba musi byt zapsana v nich
      Ukladat je stejne jako portal scripty jsou potreba pro build serveru = dynamicke programovani
  • TODO slozky upravit na browsable, allowedOpen in browser, must be authorized Nova agenda
    ++++++++

  1. Galerie - Typ Video/Audio/Image/Other - vztahuje se k IMPORT/EXPORT

vytvořit nový panel Funkcionality - Typ Export/Import/Operace
1)udelat volani autorefresh DB->DOC

2a)Napsat dokumentaci že přepisuje přímo pro Live debuging
2b)import scriptů ze souborů do DB / export scriptů z DB so souborů

  1. změnit názvy scriptů podle toho co dělají a vše co se vztahuje k dané funkcionalitě napsat v 1 scriptu
    nebude se to muset hledat a bude to na 1 místě SUPER
  • i translation atd vše nasázet do globalscriptů
    a k tomu udělat nastavení info typu - Global / Only Page /
    a druhý typ Anonymous / ROLE

a udělat jak je v systému seznam API adres a ten bude sám měnit volání Anonymou/Auth podle toho jestli je přihlášený

NEWS
Nástoje Webu / nastavení Guest/ROLE a dle hoto se načtou - nějaká ikonka na webu
admin nástroje - přesunout logger
Guest nástroje -
a k tomu udělat nástroj zobrazení Dat ve Storage s možností smazat
a do toho nástoje udělat přizazené ID a obsah html stránky načíst do něj

  • třeba mu udělat vlastní čast SCRIPT a něm si sám nastaví cokoliv
    = a přesunout tam vševchny statické tooly
  • SYSTEM Info Panel - IKONA ve footeru
  1. Aktualizovat local DB Dev News

  2. při načtení webset uložit Datum načtení a vytvořit nový parameter jak často Refrešovat
    ne neřeší když je to uloženo

Data bude chtít vymyslet s životností něco jako definice dat

  1. udělat třídu co doplní ikonu COPY a PRINT

  2. Ke scriptům udělat možnost zadání názvu nástroje a podle toho natahovat CSS a JS
    udělat něco jako INIT a ten zkontroluje jestli je načtený popř ho načte

NáPAD udelat MikroWeby + NODEJS.RUN něco jako vlastní builder a exportit WEBY

  1. Vytvořit a publikovat úkolovník NEWS - přidat typ - Úkoly/ChangeLog/News/Reklama

  2. Admin nástroj Importovat Css / Js

VEDE TO K vygenerování INDEX.html s exoportem všeho a spuštění NODE.JS a jede celý web

NEXT IDEA Analyzer Obsahu a vytahat všechny dole do knihovny pro Web tool
následno okno HTML + okno SCRIPT + STYLE ať si každý udělá stránku a vyexportuje ji

NEXT IDEA správnost kódu vždy končit středníkem = Analyzer LET,const,VAR a vygeneruje okno proměných stránky
kotrola, zda již někde neexistuje

== Generátor multifunkčích Webů s možností si ho celý poskládat z nástrojů

  1. Dát V Systému Settings - zda MultiInstance ENABLE/DISABLE

  2. VYMYSLET Export Group/Menu SYSTEM do Dokumentace + Popisy s automatickou grafikou členění a rozklikem pro web
    a takto to pak přidat jako bod na stránku panelů ve skupině IS/MS SYSTEM

  3. vymyslet automatické přidání parametru výška řádku systému a automaticky přidat nastavení do kódu
    jinak tento parametr, nebo seznam parametrů by mohl být definovn v menu a daný form už by jen poslouchal a plně dynamicky
    nastaví něco[object with name] - parametrem
    (začít tvořit SYSTEM Generator)

  4. jednou provždy opravit TimeStamp Timestamp na TimeStamp

  5. we webmenu přidat zda po stránce načíst jen HTML part nebo Celý Obsah

  6. dodělat unikatní cesty ke sciptum bez js/css složky kvůli nástrojům co maji bordel i z IS při uložení

  7. každý script by měl mít části guest/webuser/admin/provider aby se načítaly jen ty správné

  8. přenést css z Layoutu

  9. opravit volání API z web Editorů a editor přenést do WebAdmina -

  10. Udělat zálohování scriptů/ Import Složky

  11. SYSTEM pro enumy udělat tabulku kde skupina BUDE jen text - takto to půjde spravovat
    jedna tabulka pro všechny enumy

  12. minifikace bude operace nebo ať ti to udělá sám

  13. dodelat ukladani minify saving je odstaveny SaveNewMinifiedFile

  14. SYSTEM sjednotit APP konfiguraci jako na Backendu

24] SYSTEM v nekterych setrecord - Chybi TRY chatch

  1. scafolging přesunout do prázdného projektu [bude z něho regenetate Projekt] - řeší RYCHLOST

26 REACT DESKTOP dobry na pouziti v generatoru
https://react-beautiful-dnd.netlify.app/?path=/story/board--scrollable-columns
netřeba, již zahrnuto v Technologii Metro4

  1. přidat do stránek OpenDocView jak je na Nomadu

  2. zapnout možnost otevřít 1 okno vícekrát, rozdělit do více instancí
    28a) TODO Nastavení Globálních Stylů

  3. zapnout možnost rozdělit systém na více instancí

  4. designer JS+CSS taky udělat s výběrem jako u knihovny a překlik

  5. dodělat vyhledávání ve scriptech

  6. prezentační knihovna Funkcionality

  7. prezentační knihovna Knihovny

  8. prezentační knihovna Služby

  9. prezentační knihovna Statické Nástroje a Generátory

  10. registrovat více controlerů (teĎ mám default) a na základě toho udělat více webů? Třeba i s překrytím stejné URL?

  11. do scheduleru přidat scripty + startcommand [procesy ukladat do runtimelistu]

  12. nová agenda Multi Web server (react,php,electron,atd..) => obsah jako StaticWeby

  • start command, install command, build command, možná list commandů k zadání
    • certifikát do složky server/cert + script na generování pro LIN/WIN, AUTO zahrnout subdomény
  1. nová agenda controling - dynamické SQL + předpřipravené GrafFormy pro vlastní definice pohledů

  2. nová agenda TableBuilder - Rozšíření DB + vygenerování kódu API

  3. StaticWeby jako upload folder/file s Adr strukturou a náhledem souborů(Webview - pict,video,audio/Editor JS,CSS,html)

  4. StaticWeb i MultiWebServer by mohly mít direct Clon z Githubu

  5. Prověřit Generic GraphQL - jestli má ještě nějaký přínos - DATASET Dynamic Builder pro Controling/Grafy

  6. Zaimplementovat SSH

  7. dát SSH a FTP do plánovaných úloh

  8. zbývá dokumentace vyhledávače pro editory

  9. webdocKnihovna není nasazená na webu

  10. dodelat sitemapu

  11. static files, chybi form a navazane data
    50] v systému řešení tooltipů, vyzobat všechny descriptiony k záznamům, nadřazených skupin atd, a osnovou je vyskládat, a vlevo nahoře pridat ikonu INFO

  12. udělat agendu emaillogger

  13. udělat 1x SP pro čištění zadaných tabulek

  14. Převzít hotel HTML messaging, přidat changelog, group-users-blog,Task Request-Blog,Rss-News,Web-Socket Messaging, Web-Socket Blog

  15. licence pro web

  16. stahovani předloh stranek v html completu: https://www.creative-tim.com/ tyto pak stačí zeditovat a jede se

  17. vytvořit osobní parametry uživatele - dynamický formulář zde si vybere zasílat zprávy atd, paramtry zadá správce v nové agendě s typem parametru - mixed enum + copy dynam param form, funkce link, email web atd - hosting

  18. vytvořit layout s překladačem a modulům dát možnost volby layoutu - až po celé HTML - musí to jít, povinnost ma pouze renderBody

  19. provider ke kazde subdomene website moznost zalozit localDB co je nachystany

  20. SystemOperation, pridat inputtype [none,int,bit,table,json,etc.], inputdefinition[name,tablestructure], a kdyz bude zobrazit generic popup pro vyplneni - pro operace se vstupy atd

  21. docstemplates, pridat higlighttype,filetype [.exe atd] a zobrazovat v highlight okne se stazenim
    61] pro portal, zalozit agendy web backroundvideoList + option zvuku, mp3list
    62] sourcebrowser - zkusit zaimplementovat plugin a generovat browser jako soucast backendu
    63] kompletní dokumentace a zobrazeni mermaidů, pro Server, System, DB, WEB static tools, webFunctions Library-API-behavior-object atd, s popisi , rozložením, atd..

  22. zkusit doplnit "Docs" o highlight, mermaid

  23. System Vytvořit Datagrid Context menu - obshlahnout ze swap Builder
    E:\Projekty\MyGitHub\FreeProjects\LocalDB-MSSQL-IS-System-Generator

  24. implementovat github do serveru jako server službu

  25. Nabídnout moje projekty githubu včetně předchopzí verze System generatoru SwapBuilder

  26. přidat chystané novinky a vkládat tam github projekty

  27. changelogh zaimplementované

  28. vytvořit tabulku s datum meno, popis, soubor - a do té se budou ukladat změny, bud tam nahraji celou změnu
    nebo to bude dělat nějaký triger, a tak budu mít hotovou agengu chaglelogu i s generováním pro web

  29. Zmenit správu šablon na dynamickou přes agendu, tak jich bude moci být neomezeně
    72] v port8lu tvorba webu udelat knihovnu s onlineukazkami


PROVIDING

  1. dodelat static files a projekty budou ve static files se kopirovat z GLOBAL do určitých složek
    a k tomu bude přidán index a zakouppené administrace, pohledy, dokumentace,

  2. vytvorit zobrazeni struktur serverDbDiagram projekt a jejich rozpadů logiky

  3. pridat pole globalversion, customversion, solution(licsrv,docsrv,) a vytvořit, migration procedure
    která vyzobe rozdili, uloyi script do DB, povysi verze, upozorni na custom, tzn jeste migracni tabulky

  4. vytvorit rozpis struktury databáze a editor s volbou tabulek, s funkcí přidat nové pole - celá migracni logika rizena ze systému
    musi vzniknoout rizeni rozvoje databáze

  5. sjednotit template files a pridat typ, skupinu,

  6. sehnat sql convert to jiných typu sql

  7. zaimplementovat sourcebrowser do serveru aby zobrazoval web

  8. zkusit zaimplementovat astnetstatic pro export webu jako staticky i s daty a vyexportovat soucasny portal

  9. vytvořit generator infotouchapp(možno i maui verzi pro mobily) se zobrazením jednoduchých html stránek s group/menu strukturou
    plus sipky tam/zpet menu = resení pro infopanely viz radnice panel

  10. system dodat fultext search do knihoven kódů se skrytím položek, kde nebyl nalezen

  11. dodat do všech/vybraných tabulek description - bude sloužit jako fast help pro systém i generování webu

  12. vyzkoušet konverzi xaml->html a system prenest na html
    13] opravit načítání portálu a scriptu do server localtable ulevi DB
    14] prestehovat github a docs do podslozky PROVIDER
    15] add xaml web to netcore
    16] azure server pro muj portal bude potřeba z duvodu provider funkcí, které jsou bat atd

  13. web popsat jako static Technology - s možností vyseparovat libovolnou funkcionalitu

  14. Dodelat WebScrapScript a zaradit do nove agendy servers a takto se budou tvorit node, react atd, servery

  15. LayerJS Zoom umi nahledy html stranek a zoomove je otevre

  16. vytvořit Server agendu Process Task s možností on Startup a zapínáním a vypínáním online

  17. scripty portalu dat do lokalni tabulky - snizi pocet dotazu na DB

  18. SYSTEM Přenastavit seznam IT Nástroje a Manuály - Vypublikovat na Web v Novem Desktopu


MarkDown Item Template

    

Úvod Start -DATABASE-RULE

Vše začíná U databáze. Pravidla určující MultiLogiku v 1 Balíčku. Zde najdete Kompletní Strukturu Aktuální Databáze a Seznam Pravidel, které je obecně dobré dodržovat

1 pravidlo: Každé slovo má Hluboký Význam

Struktura Tabulek te stále Téměř totožná, Pár Pravidel stačí k vytvoření dokonalého Systému

DB - Export Tabulek Řešení,

Zde najdete Všechny Tabulky Řešení, Struktura má Centrální Logiku, která zamezuje vzniku chyb

TBL BasicAttachmentList

			
 IF OBJECT_ID('[dbo].[BasicAttachmentList]') IS NOT NULL 
 DROP TABLE [dbo].[BasicAttachmentList] 
 GO
 CREATE TABLE [dbo].[BasicAttachmentList] ( 
 [Id]          INT              IDENTITY(1,1)          NOT NULL,
 [ParentId]    INT                                     NOT NULL,
 [ParentType]  VARCHAR(20)                             NOT NULL,
 [FileName]    VARCHAR(150)                            NOT NULL,
 [Attachment]  VARBINARY(max)                          NOT NULL,
 [UserId]      INT                                     NOT NULL,
 [TimeStamp]   DATETIME2                               NOT NULL  CONSTRAINT [DF_AttachmentList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_AttachmentList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [UX_AttachmentList]  UNIQUE      NONCLUSTERED ([ParentId] asc, [FileName] asc) ,
 CONSTRAINT [FK_AttachmentList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 
 GO
 
 CREATE NONCLUSTERED INDEX [IX_AttachmentList] 
    ON [dbo].[BasicAttachmentList] ([ParentId] asc, [ParentType] asc)

TBL BasicCalendarList

			
 IF OBJECT_ID('[dbo].[BasicCalendarList]') IS NOT NULL 
 DROP TABLE [dbo].[BasicCalendarList] 
 GO
 CREATE TABLE [dbo].[BasicCalendarList] ( 
 [UserId]     INT                                     NOT NULL,
 [Date]       DATE                                    NOT NULL,
 [Notes]      VARCHAR(1024)                               NULL,
 [TimeStamp]  DATETIME2                               NOT NULL  CONSTRAINT [DF_Calendar_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_Calendar]  PRIMARY KEY CLUSTERED    ([UserId] asc, [Date] asc) ,
 CONSTRAINT [FK_Calendar_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id)  ON UPDATE CASCADE  ON DELETE CASCADE )
 
 

TBL BasicCurrencyList

			
 IF OBJECT_ID('[dbo].[BasicCurrencyList]') IS NOT NULL 
 DROP TABLE [dbo].[BasicCurrencyList] 
 GO
 CREATE TABLE [dbo].[BasicCurrencyList] ( 
 [Id]            INT              IDENTITY(1,1)          NOT NULL,
 [Name]          VARCHAR(5)                              NOT NULL,
 [ExchangeRate]  NUMERIC(10,2)                           NOT NULL  CONSTRAINT [DF_CurrencyList_ExchangeRate] DEFAULT ((1)),
 [Fixed]         BIT                                     NOT NULL  CONSTRAINT [DF_CurrencyList_Fixed] DEFAULT ((1)),
 [Description]   TEXT                                        NULL,
 [UserId]        INT                                     NOT NULL,
 [Active]        BIT                                     NOT NULL  CONSTRAINT [DF_CurrencyList_Active] DEFAULT ((1)),
 [TimeStamp]     DATETIME2                               NOT NULL  CONSTRAINT [DF_CurrencyList_TimeStamp] DEFAULT (getdate()),
 [Default]       BIT                                     NOT NULL  CONSTRAINT [DF_CurrencyList_Default] DEFAULT ((0)),
 CONSTRAINT   [PK_CurrencyList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT [FK_CurrencyList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 
 GO
 
 CREATE   TRIGGER [dbo].[TR_CurrencyList] ON [dbo].[BasicCurrencyList]
FOR INSERT, UPDATE, DELETE
AS
DECLARE @Operation VARCHAR(15)
 
IF EXISTS (SELECT 0 FROM inserted)
BEGIN
	DECLARE @setDefault bit;DECLARE @RecId int;
	SET NOCOUNT ON;

    IF EXISTS (SELECT 0 FROM deleted)
    BEGIN --UPDADE
		SELECT @setDefault = ins.[Default] from inserted ins;
		SELECT @RecId = ins.Id from inserted ins;

		IF(@setDefault = 1) BEGIN
			UPDATE [dbo].BasicCurrencyList SET [Default] = 0 WHERE Id <> @RecId; 		
		END
	END ELSE
		BEGIN -- INSERT
			SELECT @setDefault = ins.[Default] from inserted ins;
			SELECT @RecId = ins.Id from inserted ins;

			IF(@setDefault = 1) BEGIN
				UPDATE [dbo].BasicCurrencyList SET [Default] = 0 WHERE Id <> @RecId; 		
			END
		
		END
END ELSE 
BEGIN --DELETE
	SELECT @setDefault = ins.[Default] from deleted ins;
	SELECT @RecId = ins.Id from deleted ins;

	IF(@setDefault = 1) BEGIN
		UPDATE [dbo].BasicCurrencyList SET [Default] = 1  
		WHERE Id IN(SELECT TOP (1) Id FROM [dbo].BasicCurrencyList WHERE Id <> @RecId)
		;
	END
END

 GO

TBL BasicImageGalleryList

			
 IF OBJECT_ID('[dbo].[BasicImageGalleryList]') IS NOT NULL 
 DROP TABLE [dbo].[BasicImageGalleryList] 
 GO
 CREATE TABLE [dbo].[BasicImageGalleryList] ( 
 [Id]          INT              IDENTITY(1,1)          NOT NULL,
 [IsPrimary]   BIT                                     NOT NULL,
 [FileName]    VARCHAR(150)                            NOT NULL,
 [Attachment]  VARBINARY(max)                          NOT NULL,
 [UserId]      INT                                     NOT NULL,
 [TimeStamp]   DATETIME2                               NOT NULL  CONSTRAINT [DF_ImageGalleryList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_ImageGalleryList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [UX_ImageGalleryList]  UNIQUE      NONCLUSTERED ([FileName] asc) ,
 CONSTRAINT [FK_ImageGalleryList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 
 GO
 
 



CREATE   TRIGGER [dbo].[TR_ImageGalleryList] ON [dbo].[BasicImageGalleryList]
FOR INSERT, UPDATE, DELETE
AS
DECLARE @Operation VARCHAR(15)
 
IF EXISTS (SELECT 0 FROM inserted)
BEGIN
	DECLARE @isPrimary bit;DECLARE @RecId int;DECLARE @HotelId int;
	SET NOCOUNT ON;

    IF EXISTS (SELECT 0 FROM deleted)
    BEGIN --UPDADE
		SELECT @isPrimary = ins.[IsPrimary] from inserted ins;
		SELECT @RecId = ins.Id from inserted ins;

		IF(@isPrimary = 1) BEGIN
			UPDATE [dbo].BasicImageGalleryList SET [IsPrimary] = 0 WHERE Id <> @RecId; 		
		END
	END ELSE
		BEGIN -- INSERT
			SELECT @isPrimary = ins.[IsPrimary] from inserted ins;
			SELECT @RecId = ins.Id from inserted ins;

			IF(@isPrimary = 1) BEGIN
				UPDATE [dbo].BasicImageGalleryList SET [IsPrimary] = 0 WHERE Id <> @RecId; 		
			END
		
		END
END ELSE 
BEGIN --DELETE
	SELECT @isPrimary = ins.[IsPrimary] from deleted ins;
	SELECT @RecId = ins.Id from deleted ins;

	IF(@isPrimary = 1) BEGIN
		UPDATE [dbo].BasicImageGalleryList SET [IsPrimary] = 1  
		WHERE Id IN(SELECT TOP (1) Id FROM [dbo].BasicImageGalleryList WHERE Id <> @RecId)
		;
	END
END

 GO

TBL BasicItemList

			
 IF OBJECT_ID('[dbo].[BasicItemList]') IS NOT NULL 
 DROP TABLE [dbo].[BasicItemList] 
 GO
 CREATE TABLE [dbo].[BasicItemList] ( 
 [Id]           INT              IDENTITY(1,1)          NOT NULL,
 [PartNumber]   VARCHAR(50)                             NOT NULL,
 [Name]         VARCHAR(150)                            NOT NULL,
 [Description]  TEXT                                        NULL,
 [Unit]         VARCHAR(10)                             NOT NULL,
 [Price]        NUMERIC(10,2)                           NOT NULL,
 [VatId]        INT                                     NOT NULL,
 [CurrencyId]   INT                                     NOT NULL,
 [UserId]       INT                                     NOT NULL,
 [Active]       BIT                                     NOT NULL  CONSTRAINT [DF_ItemList_Active] DEFAULT ((1)),
 [TimeStamp]    DATETIME2                               NOT NULL  CONSTRAINT [DF_ItemList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_ItemList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_ItemList]  UNIQUE      NONCLUSTERED ([PartNumber] asc) ,
 CONSTRAINT [FK_ItemList_CurrencyList] FOREIGN KEY ([CurrencyId]) REFERENCES [dbo].[BasicCurrencyList] (Id) ,
 CONSTRAINT [FK_ItemList_UnitList] FOREIGN KEY ([Unit]) REFERENCES [dbo].[BasicUnitList] (Name) ,
 CONSTRAINT [FK_ItemList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) ,
 CONSTRAINT [FK_ItemList_VatList] FOREIGN KEY ([VatId]) REFERENCES [dbo].[BasicVatList] (Id) )
 
 

TBL BasicUnitList

			
 IF OBJECT_ID('[dbo].[BasicUnitList]') IS NOT NULL 
 DROP TABLE [dbo].[BasicUnitList] 
 GO
 CREATE TABLE [dbo].[BasicUnitList] ( 
 [Id]           INT              IDENTITY(1,1)          NOT NULL,
 [Name]         VARCHAR(10)                             NOT NULL,
 [Description]  TEXT                                        NULL,
 [UserId]       INT                                     NOT NULL,
 [Active]       BIT                                     NOT NULL  CONSTRAINT [DF_UnitList_Active] DEFAULT ((1)),
 [TimeStamp]    DATETIME2                               NOT NULL  CONSTRAINT [DF_UnitList_TimeStamp] DEFAULT (getdate()),
 [Default]      BIT                                     NOT NULL  CONSTRAINT [DF_UnitList_Default] DEFAULT ((0)),
 CONSTRAINT   [PK_UnitList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_UnitList]  UNIQUE      NONCLUSTERED ([Name] asc) ,
 CONSTRAINT [FK_UnitList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 
 GO
 
 
CREATE   TRIGGER [dbo].[TR_UnitList] ON [dbo].[BasicUnitList]
FOR INSERT, UPDATE, DELETE
AS
DECLARE @Operation VARCHAR(15)
 
IF EXISTS (SELECT 0 FROM inserted)
BEGIN
	DECLARE @setDefault bit;DECLARE @RecId int;
	SET NOCOUNT ON;

    IF EXISTS (SELECT 0 FROM deleted)
    BEGIN --UPDADE
		SELECT @setDefault = ins.[Default] from inserted ins;
		SELECT @RecId = ins.Id from inserted ins;

		IF(@setDefault = 1) BEGIN
			UPDATE [dbo].BasicUnitList SET [Default] = 0 WHERE Id <> @RecId; 		
		END
	END ELSE
		BEGIN -- INSERT
			SELECT @setDefault = ins.[Default] from inserted ins;
			SELECT @RecId = ins.Id from inserted ins;

			IF(@setDefault = 1) BEGIN
				UPDATE [dbo].BasicUnitList SET [Default] = 0 WHERE Id <> @RecId; 		
			END
		
		END
END ELSE 
BEGIN --DELETE
	SELECT @setDefault = ins.[Default] from deleted ins;
	SELECT @RecId = ins.Id from deleted ins;

	IF(@setDefault = 1) BEGIN
		UPDATE [dbo].BasicUnitList SET [Default] = 1  
		WHERE Id IN(SELECT TOP (1) Id FROM [dbo].BasicUnitList WHERE Id <> @RecId)
		;
	END
END

 GO

TBL BasicVatList

			
 IF OBJECT_ID('[dbo].[BasicVatList]') IS NOT NULL 
 DROP TABLE [dbo].[BasicVatList] 
 GO
 CREATE TABLE [dbo].[BasicVatList] ( 
 [Id]           INT              IDENTITY(1,1)          NOT NULL,
 [Name]         VARCHAR(20)                             NOT NULL,
 [Value]        NUMERIC(10,2)                           NOT NULL,
 [Default]      BIT                                     NOT NULL,
 [Description]  TEXT                                        NULL,
 [UserId]       INT                                     NOT NULL,
 [Active]       BIT                                     NOT NULL  CONSTRAINT [DF_VatList_Active] DEFAULT ((1)),
 [TimeStamp]    DATETIME2                               NOT NULL  CONSTRAINT [DF_VatList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_VatList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_VatList]  UNIQUE      NONCLUSTERED ([Value] asc, [Active] asc) ,
 CONSTRAINT [FK_VatList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 
 GO
 
 CREATE   TRIGGER [dbo].[TR_VatList] ON [dbo].[BasicVatList]
FOR INSERT, UPDATE, DELETE
AS
DECLARE @Operation VARCHAR(15)
 
IF EXISTS (SELECT 0 FROM inserted)
BEGIN
	DECLARE @setDefault bit;DECLARE @RecId int;
	SET NOCOUNT ON;

    IF EXISTS (SELECT 0 FROM deleted)
    BEGIN --UPDADE
		SELECT @setDefault = ins.[Default] from inserted ins;
		SELECT @RecId = ins.Id from inserted ins;

		IF(@setDefault = 1) BEGIN
			UPDATE [dbo].BasicVatList SET [Default] = 0 WHERE Id <> @RecId; 		
		END
	END ELSE
		BEGIN -- INSERT
			SELECT @setDefault = ins.[Default] from inserted ins;
			SELECT @RecId = ins.Id from inserted ins;

			IF(@setDefault = 1) BEGIN
				UPDATE [dbo].BasicVatList SET [Default] = 0 WHERE Id <> @RecId; 		
			END
		
		END
END ELSE 
BEGIN --DELETE
	SELECT @setDefault = ins.[Default] from deleted ins;
	SELECT @RecId = ins.Id from deleted ins;

	IF(@setDefault = 1) BEGIN
		UPDATE [dbo].BasicVatList SET [Default] = 1  
		WHERE Id IN(SELECT TOP (1) Id FROM [dbo].BasicVatList WHERE Id <> @RecId)
		;
	END
END

 GO

TBL BasicViewAttachmentList

			
IF OBJECT_ID('[dbo].[BasicViewAttachmentList]') IS NOT NULL 
 DROP  VIEW      [dbo].[BasicViewAttachmentList] 
 GO
 CREATE VIEW dbo.BasicViewAttachmentList
AS
SELECT        TOP (100) PERCENT AL.Id, AL.FileName, IL.PartNumber, AL.TimeStamp
FROM            dbo.BasicAttachmentList AS AL LEFT OUTER JOIN
                         dbo.BasicItemList AS IL ON AL.ParentId = IL.Id AND AL.ParentType = 'ITEM'
ORDER BY AL.FileName

GO


TBL BusinessAddressList

			
 IF OBJECT_ID('[dbo].[BusinessAddressList]') IS NOT NULL 
 DROP TABLE [dbo].[BusinessAddressList] 
 GO
 CREATE TABLE [dbo].[BusinessAddressList] ( 
 [Id]           INT              IDENTITY(1,1)          NOT NULL,
 [AddressType]  VARCHAR(20)                             NOT NULL,
 [CompanyName]  VARCHAR(150)                            NOT NULL,
 [ContactName]  VARCHAR(150)                                NULL,
 [Street]       VARCHAR(150)                            NOT NULL,
 [City]         VARCHAR(150)                            NOT NULL,
 [PostCode]     VARCHAR(20)                             NOT NULL,
 [Phone]        VARCHAR(20)                             NOT NULL,
 [Email]        VARCHAR(150)                                NULL,
 [BankAccount]  VARCHAR(150)                                NULL,
 [Ico]          VARCHAR(20)                                 NULL,
 [Dic]          VARCHAR(20)                                 NULL,
 [UserId]       INT                                     NOT NULL,
 [Active]       BIT                                     NOT NULL  CONSTRAINT [DF_AddressList_Active] DEFAULT ((1)),
 [TimeStamp]    DATETIME2                               NOT NULL  CONSTRAINT [DF_AddressList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_AddressList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT [FK_AddressList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 
 GO
 
 CREATE NONCLUSTERED INDEX [IX_AddressList] 
    ON [dbo].[BusinessAddressList] ([AddressType] asc)

TBL BusinessBranchList

			
 IF OBJECT_ID('[dbo].[BusinessBranchList]') IS NOT NULL 
 DROP TABLE [dbo].[BusinessBranchList] 
 GO
 CREATE TABLE [dbo].[BusinessBranchList] ( 
 [Id]           INT              IDENTITY(1,1)          NOT NULL,
 [CompanyName]  VARCHAR(150)                            NOT NULL,
 [ContactName]  VARCHAR(150)                                NULL,
 [Street]       VARCHAR(150)                            NOT NULL,
 [City]         VARCHAR(150)                            NOT NULL,
 [PostCode]     VARCHAR(20)                             NOT NULL,
 [Phone]        VARCHAR(20)                             NOT NULL,
 [Email]        VARCHAR(150)                                NULL,
 [BankAccount]  VARCHAR(150)                                NULL,
 [Ico]          VARCHAR(20)                                 NULL,
 [Dic]          VARCHAR(20)                                 NULL,
 [UserId]       INT                                     NOT NULL,
 [Active]       BIT                                     NOT NULL  CONSTRAINT [DF_BranchList_Active] DEFAULT ((1)),
 [TimeStamp]    DATETIME2                               NOT NULL  CONSTRAINT [DF_BranchList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_BranchList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_BranchList]  UNIQUE      NONCLUSTERED ([CompanyName] asc) ,
 CONSTRAINT [FK_BranchList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 
 GO
 
 
CREATE   TRIGGER [dbo].[TR_BranchList] ON [dbo].[BusinessBranchList]
FOR INSERT, UPDATE, DELETE
AS
DECLARE @Operation VARCHAR(15)
 
IF EXISTS (SELECT 0 FROM inserted)
BEGIN
	DECLARE @setActive bit;DECLARE @RecId int;
	SET NOCOUNT ON;

    IF EXISTS (SELECT 0 FROM deleted)
    BEGIN --UPDADE
		SELECT @setActive = ins.[Active] from inserted ins;
		SELECT @RecId = ins.Id from inserted ins;

		IF(@setActive = 1) BEGIN
			UPDATE [dbo].BusinessBranchList SET [Active] = 0 WHERE Id <> @RecId; 		
		END
	END ELSE
		BEGIN -- INSERT
			SELECT @setActive = ins.[Active] from inserted ins;
			SELECT @RecId = ins.Id from inserted ins;

			IF(@setActive = 1) BEGIN
				UPDATE [dbo].BusinessBranchList SET [Active] = 0 WHERE Id <> @RecId; 		
			END
		
		END
END ELSE 
BEGIN --DELETE
	SELECT @setActive = ins.[Active] from deleted ins;
	SELECT @RecId = ins.Id from deleted ins;

	IF(@setActive = 1) BEGIN
		UPDATE [dbo].BusinessBranchList SET [Active] = 1  
		WHERE Id IN(SELECT TOP (1) Id FROM [dbo].BusinessBranchList WHERE Id <> @RecId)
		;
	END
END

 GO
 GO
 
 EXEC sys.sp_addextendedproperty
          @name = N'MS_Description', @value = N'',
          @level0type = N'SCHEMA', @level0name = [dbo],
          @level1type = N'TABLE', @level1name = [BusinessBranchList];

TBL BusinessCreditNoteList

			
 IF OBJECT_ID('[dbo].[BusinessCreditNoteList]') IS NOT NULL 
 DROP TABLE [dbo].[BusinessCreditNoteList] 
 GO
 CREATE TABLE [dbo].[BusinessCreditNoteList] ( 
 [Id]                 INT              IDENTITY(1,1)          NOT NULL,
 [DocumentNumber]     VARCHAR(20)                             NOT NULL,
 [Supplier]           VARCHAR(512)                            NOT NULL,
 [Customer]           VARCHAR(512)                            NOT NULL,
 [IssueDate]          DATETIME2                               NOT NULL,
 [InvoiceNumber]      VARCHAR(20)                                 NULL,
 [Storned]            BIT                                     NOT NULL,
 [TotalCurrencyId]    INT                                     NOT NULL,
 [Description]        TEXT                                        NULL,
 [TotalPriceWithVat]  NUMERIC(10,2)                           NOT NULL,
 [UserId]             INT                                     NOT NULL,
 [TimeStamp]          DATETIME2                               NOT NULL  CONSTRAINT [DF_CreditNoteList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_CreditNoteList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_CreditNoteList]  UNIQUE      NONCLUSTERED ([DocumentNumber] asc) ,
 CONSTRAINT [FK_CreditNoteList_CurrencyList] FOREIGN KEY ([TotalCurrencyId]) REFERENCES [dbo].[BasicCurrencyList] (Id) ,
 CONSTRAINT [FK_CreditNoteList_OutgoingInvoiceList] FOREIGN KEY ([InvoiceNumber]) REFERENCES [dbo].[BusinessOutgoingInvoiceList] (DocumentNumber) ,
 CONSTRAINT [FK_CreditNoteList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 

TBL BusinessCreditNoteSupportList

			
 IF OBJECT_ID('[dbo].[BusinessCreditNoteSupportList]') IS NOT NULL 
 DROP TABLE [dbo].[BusinessCreditNoteSupportList] 
 GO
 CREATE TABLE [dbo].[BusinessCreditNoteSupportList] ( 
 [Id]                 INT              IDENTITY(1,1)          NOT NULL,
 [DocumentNumber]     VARCHAR(20)                             NOT NULL,
 [PartNumber]         VARCHAR(50)                                 NULL,
 [Name]               VARCHAR(150)                            NOT NULL,
 [Unit]               VARCHAR(10)                             NOT NULL,
 [PcsPrice]           NUMERIC(10,2)                           NOT NULL,
 [Count]              NUMERIC(10,2)                           NOT NULL,
 [TotalPrice]         NUMERIC(10,2)                           NOT NULL,
 [Vat]                NUMERIC(10,2)                           NOT NULL,
 [TotalPriceWithVat]  NUMERIC(10,2)                           NOT NULL,
 [UserId]             INT                                     NOT NULL,
 [TimeStamp]          DATETIME2                               NOT NULL  CONSTRAINT [DF_CreditNoteItemList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_CreditNoteItemList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT [FK_CreditNoteItemList_CreditNoteList] FOREIGN KEY ([DocumentNumber]) REFERENCES [dbo].[BusinessCreditNoteList] (DocumentNumber)  ON DELETE CASCADE ,
 CONSTRAINT [FK_CreditNoteItemList_UnitList] FOREIGN KEY ([Unit]) REFERENCES [dbo].[BasicUnitList] (Name) ,
 CONSTRAINT [FK_CreditNoteItemList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 

TBL BusinessExchangeRateList

			
 IF OBJECT_ID('[dbo].[BusinessExchangeRateList]') IS NOT NULL 
 DROP TABLE [dbo].[BusinessExchangeRateList] 
 GO
 CREATE TABLE [dbo].[BusinessExchangeRateList] ( 
 [Id]           INT              IDENTITY(1,1)          NOT NULL,
 [CurrencyId]   INT                                     NOT NULL,
 [Value]        DECIMAL(10,2)                           NOT NULL,
 [ValidFrom]    DATE                                        NULL,
 [ValidTo]      DATE                                        NULL,
 [Description]  TEXT                                        NULL,
 [UserId]       INT                                     NOT NULL,
 [Active]       BIT                                     NOT NULL  CONSTRAINT [DF_CourseList_Active] DEFAULT ((1)),
 [TimeStamp]    DATETIME2                               NOT NULL  CONSTRAINT [DF_CourseList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_CourseList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT [FK_CourseList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) ,
 CONSTRAINT [FK_ExchangeRateList_CurrencyList] FOREIGN KEY ([CurrencyId]) REFERENCES [dbo].[BasicCurrencyList] (Id) )
 
 

TBL BusinessIncomingInvoiceList

			
 IF OBJECT_ID('[dbo].[BusinessIncomingInvoiceList]') IS NOT NULL 
 DROP TABLE [dbo].[BusinessIncomingInvoiceList] 
 GO
 CREATE TABLE [dbo].[BusinessIncomingInvoiceList] ( 
 [Id]                 INT              IDENTITY(1,1)          NOT NULL,
 [DocumentNumber]     VARCHAR(20)                             NOT NULL,
 [Supplier]           VARCHAR(512)                            NOT NULL,
 [Customer]           VARCHAR(512)                            NOT NULL,
 [IssueDate]          DATETIME2                               NOT NULL,
 [TaxDate]            DATETIME2                               NOT NULL,
 [MaturityDate]       DATETIME2                               NOT NULL,
 [PaymentMethodId]    INT                                     NOT NULL,
 [MaturityId]         INT                                     NOT NULL,
 [OrderNumber]        VARCHAR(50)                                 NULL,
 [Storned]            BIT                                     NOT NULL,
 [PaymentStatusId]    INT                                     NOT NULL,
 [TotalCurrencyId]    INT                                     NOT NULL,
 [Description]        TEXT                                        NULL,
 [TotalPriceWithVat]  NUMERIC(10,2)                           NOT NULL,
 [UserId]             INT                                     NOT NULL,
 [TimeStamp]          DATETIME2                               NOT NULL  CONSTRAINT [DF_IncomingInvoiceList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_IncomingInvoiceList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_IncomingInvoiceList]  UNIQUE      NONCLUSTERED ([DocumentNumber] asc) ,
 CONSTRAINT [FK_IncomingInvoiceList_CurrencyList] FOREIGN KEY ([TotalCurrencyId]) REFERENCES [dbo].[BasicCurrencyList] (Id) ,
 CONSTRAINT [FK_IncomingInvoiceList_MaturityList] FOREIGN KEY ([MaturityId]) REFERENCES [dbo].[BusinessMaturityList] (Id) ,
 CONSTRAINT [FK_IncomingInvoiceList_PaymentMethodList] FOREIGN KEY ([PaymentMethodId]) REFERENCES [dbo].[BusinessPaymentMethodList] (Id) ,
 CONSTRAINT [FK_IncomingInvoiceList_PaymentStatusList] FOREIGN KEY ([PaymentStatusId]) REFERENCES [dbo].[BusinessPaymentStatusList] (Id) ,
 CONSTRAINT [FK_IncomingInvoiceList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 

TBL BusinessIncomingInvoiceSupportList

			
 IF OBJECT_ID('[dbo].[BusinessIncomingInvoiceSupportList]') IS NOT NULL 
 DROP TABLE [dbo].[BusinessIncomingInvoiceSupportList] 
 GO
 CREATE TABLE [dbo].[BusinessIncomingInvoiceSupportList] ( 
 [Id]                 INT              IDENTITY(1,1)          NOT NULL,
 [DocumentNumber]     VARCHAR(20)                             NOT NULL,
 [PartNumber]         VARCHAR(50)                                 NULL,
 [Name]               VARCHAR(150)                            NOT NULL,
 [Unit]               VARCHAR(10)                             NOT NULL,
 [PcsPrice]           NUMERIC(10,2)                           NOT NULL,
 [Count]              NUMERIC(10,2)                           NOT NULL,
 [TotalPrice]         NUMERIC(10,2)                           NOT NULL,
 [Vat]                NUMERIC(10,2)                           NOT NULL,
 [TotalPriceWithVat]  NUMERIC(10,2)                           NOT NULL,
 [UserId]             INT                                     NOT NULL,
 [TimeStamp]          DATETIME2                               NOT NULL  CONSTRAINT [DF_IncomingInvoiceItemList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_IncomingInvoiceItemList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT [FK_IncomingInvoiceItemList_IncomingInvoiceList] FOREIGN KEY ([DocumentNumber]) REFERENCES [dbo].[BusinessIncomingInvoiceList] (DocumentNumber)  ON DELETE CASCADE ,
 CONSTRAINT [FK_IncomingInvoiceItemList_UnitList] FOREIGN KEY ([Unit]) REFERENCES [dbo].[BasicUnitList] (Name) ,
 CONSTRAINT [FK_IncomingInvoiceItemList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 
 GO
 
 CREATE NONCLUSTERED INDEX [IX_IncomingInvoiceItemList] 
    ON [dbo].[BusinessIncomingInvoiceSupportList] ([DocumentNumber] asc)

TBL BusinessIncomingOrderList

			
 IF OBJECT_ID('[dbo].[BusinessIncomingOrderList]') IS NOT NULL 
 DROP TABLE [dbo].[BusinessIncomingOrderList] 
 GO
 CREATE TABLE [dbo].[BusinessIncomingOrderList] ( 
 [Id]                   INT              IDENTITY(1,1)          NOT NULL,
 [DocumentNumber]       VARCHAR(20)                             NOT NULL,
 [Supplier]             VARCHAR(512)                            NOT NULL,
 [Customer]             VARCHAR(512)                            NOT NULL,
 [Storned]              BIT                                     NOT NULL,
 [TotalCurrencyId]      INT                                     NOT NULL,
 [Description]          TEXT                                        NULL,
 [CustomerOrderNumber]  VARCHAR(50)                                 NULL,
 [TotalPriceWithVat]    NUMERIC(10,2)                           NOT NULL,
 [UserId]               INT                                     NOT NULL,
 [TimeStamp]            DATETIME2                               NOT NULL  CONSTRAINT [DF_IncomingOrderList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_IncomingOrderList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_IncomingOrderList]  UNIQUE      NONCLUSTERED ([DocumentNumber] asc) ,
 CONSTRAINT [FK_IncomingOrderList_CurrencyList] FOREIGN KEY ([TotalCurrencyId]) REFERENCES [dbo].[BasicCurrencyList] (Id) ,
 CONSTRAINT [FK_IncomingOrderList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 
 GO
 
 CREATE NONCLUSTERED INDEX [IX_IncomingOrderList_Supplier] 
    ON [dbo].[BusinessIncomingOrderList] ([Supplier] asc)

TBL BusinessIncomingOrderSupportList

			
 IF OBJECT_ID('[dbo].[BusinessIncomingOrderSupportList]') IS NOT NULL 
 DROP TABLE [dbo].[BusinessIncomingOrderSupportList] 
 GO
 CREATE TABLE [dbo].[BusinessIncomingOrderSupportList] ( 
 [Id]                 INT              IDENTITY(1,1)          NOT NULL,
 [DocumentNumber]     VARCHAR(20)                             NOT NULL,
 [PartNumber]         VARCHAR(50)                                 NULL,
 [Name]               VARCHAR(150)                            NOT NULL,
 [Unit]               VARCHAR(10)                             NOT NULL,
 [PcsPrice]           NUMERIC(10,2)                           NOT NULL,
 [Count]              NUMERIC(10,2)                           NOT NULL,
 [TotalPrice]         NUMERIC(10,2)                           NOT NULL,
 [Vat]                NUMERIC(10,2)                           NOT NULL,
 [TotalPriceWithVat]  NUMERIC(10,2)                           NOT NULL,
 [UserId]             INT                                     NOT NULL,
 [TimeStamp]          DATETIME2                               NOT NULL  CONSTRAINT [DF_IncomingOrderItemList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_IncomingOrderItemList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT [FK_IncomingOrderItemList_IncomingOrderList] FOREIGN KEY ([DocumentNumber]) REFERENCES [dbo].[BusinessIncomingOrderList] (DocumentNumber)  ON DELETE CASCADE ,
 CONSTRAINT [FK_IncomingOrderItemList_UnitList] FOREIGN KEY ([Unit]) REFERENCES [dbo].[BasicUnitList] (Name) ,
 CONSTRAINT [FK_IncomingOrderItemList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 
 GO
 
 CREATE NONCLUSTERED INDEX [IX_IncomingOrderItemList] 
    ON [dbo].[BusinessIncomingOrderSupportList] ([DocumentNumber] asc)

TBL BusinessMaturityList

			
 IF OBJECT_ID('[dbo].[BusinessMaturityList]') IS NOT NULL 
 DROP TABLE [dbo].[BusinessMaturityList] 
 GO
 CREATE TABLE [dbo].[BusinessMaturityList] ( 
 [Id]           INT              IDENTITY(1,1)          NOT NULL,
 [Name]         VARCHAR(50)                             NOT NULL,
 [Value]        INT                                     NOT NULL,
 [Default]      BIT                                     NOT NULL,
 [Description]  TEXT                                        NULL,
 [UserId]       INT                                     NOT NULL,
 [Active]       BIT                                     NOT NULL  CONSTRAINT [DF_MaturityList_Active] DEFAULT ((1)),
 [TimeStamp]    DATETIME2                               NOT NULL  CONSTRAINT [DF_MaturityList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_MaturityList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_MaturityList]  UNIQUE      NONCLUSTERED ([Name] asc) ,
 CONSTRAINT [FK_MaturityList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 
 GO
 
 
CREATE   TRIGGER [dbo].[TR_MaturityList] ON [dbo].[BusinessMaturityList]
FOR INSERT, UPDATE, DELETE
AS
DECLARE @Operation VARCHAR(15)
 
IF EXISTS (SELECT 0 FROM inserted)
BEGIN
	DECLARE @setDefault bit;DECLARE @RecId int;
	SET NOCOUNT ON;

    IF EXISTS (SELECT 0 FROM deleted)
    BEGIN --UPDADE
		SELECT @setDefault = ins.[Default] from inserted ins;
		SELECT @RecId = ins.Id from inserted ins;

		IF(@setDefault = 1) BEGIN
			UPDATE [dbo].BusinessMaturityList SET [Default] = 0 WHERE Id <> @RecId; 		
		END
	END ELSE
		BEGIN -- INSERT
			SELECT @setDefault = ins.[Default] from inserted ins;
			SELECT @RecId = ins.Id from inserted ins;

			IF(@setDefault = 1) BEGIN
				UPDATE [dbo].BusinessMaturityList SET [Default] = 0 WHERE Id <> @RecId; 		
			END
		
		END
END ELSE 
BEGIN --DELETE
	SELECT @setDefault = ins.[Default] from deleted ins;
	SELECT @RecId = ins.Id from deleted ins;

	IF(@setDefault = 1) BEGIN
		UPDATE [dbo].BusinessMaturityList SET [Default] = 1  
		WHERE Id IN(SELECT TOP (1) Id FROM [dbo].BusinessMaturityList WHERE Id <> @RecId)
		;
	END
END

 GO

TBL BusinessNotesList

			
 IF OBJECT_ID('[dbo].[BusinessNotesList]') IS NOT NULL 
 DROP TABLE [dbo].[BusinessNotesList] 
 GO
 CREATE TABLE [dbo].[BusinessNotesList] ( 
 [Id]           INT              IDENTITY(1,1)          NOT NULL,
 [Name]         VARCHAR(50)                             NOT NULL,
 [Description]  TEXT                                        NULL,
 [UserId]       INT                                     NOT NULL,
 [Active]       BIT                                     NOT NULL  CONSTRAINT [DF_NotesList_Active] DEFAULT ((1)),
 [TimeStamp]    DATETIME2                               NOT NULL  CONSTRAINT [DF_NotesList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_NotesList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_NotesList]  UNIQUE      NONCLUSTERED ([Name] asc) ,
 CONSTRAINT [FK_NotesList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 

TBL BusinessOfferList

			
 IF OBJECT_ID('[dbo].[BusinessOfferList]') IS NOT NULL 
 DROP TABLE [dbo].[BusinessOfferList] 
 GO
 CREATE TABLE [dbo].[BusinessOfferList] ( 
 [Id]                 INT              IDENTITY(1,1)          NOT NULL,
 [DocumentNumber]     VARCHAR(20)                             NOT NULL,
 [Supplier]           VARCHAR(512)                            NOT NULL,
 [Customer]           VARCHAR(512)                            NOT NULL,
 [OfferValidity]      INT                                     NOT NULL,
 [Storned]            BIT                                     NOT NULL,
 [TotalCurrencyId]    INT                                     NOT NULL,
 [Description]        TEXT                                        NULL,
 [TotalPriceWithVat]  NUMERIC(10,2)                           NOT NULL,
 [UserId]             INT                                     NOT NULL,
 [TimeStamp]          DATETIME2                               NOT NULL  CONSTRAINT [DF_OfferList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_OfferList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_OfferList]  UNIQUE      NONCLUSTERED ([DocumentNumber] asc) ,
 CONSTRAINT [FK_OfferList_CurrencyList1] FOREIGN KEY ([TotalCurrencyId]) REFERENCES [dbo].[BasicCurrencyList] (Id) ,
 CONSTRAINT [FK_OfferList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 
 GO
 
 CREATE NONCLUSTERED INDEX [IX_OfferList_Customer] 
    ON [dbo].[BusinessOfferList] ([Customer] asc)

TBL BusinessOfferSupportList

			
 IF OBJECT_ID('[dbo].[BusinessOfferSupportList]') IS NOT NULL 
 DROP TABLE [dbo].[BusinessOfferSupportList] 
 GO
 CREATE TABLE [dbo].[BusinessOfferSupportList] ( 
 [Id]                 INT              IDENTITY(1,1)          NOT NULL,
 [DocumentNumber]     VARCHAR(20)                             NOT NULL,
 [PartNumber]         VARCHAR(50)                                 NULL,
 [Name]               VARCHAR(150)                            NOT NULL,
 [Unit]               VARCHAR(10)                             NOT NULL,
 [PcsPrice]           NUMERIC(10,2)                           NOT NULL,
 [Count]              NUMERIC(10,2)                           NOT NULL,
 [TotalPrice]         NUMERIC(10,2)                           NOT NULL,
 [Vat]                NUMERIC(10,2)                           NOT NULL,
 [TotalPriceWithVat]  NUMERIC(10,2)                           NOT NULL,
 [UserId]             INT                                     NOT NULL,
 [TimeStamp]          DATETIME2                               NOT NULL  CONSTRAINT [DF_OfferItemList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_OfferItemList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT [FK_OfferItemList_OfferList] FOREIGN KEY ([DocumentNumber]) REFERENCES [dbo].[BusinessOfferList] (DocumentNumber)  ON DELETE CASCADE ,
 CONSTRAINT [FK_OfferItemList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 
 GO
 
 CREATE NONCLUSTERED INDEX [IX_OfferItemList] 
    ON [dbo].[BusinessOfferSupportList] ([DocumentNumber] asc)

TBL BusinessOutgoingInvoiceList

			
 IF OBJECT_ID('[dbo].[BusinessOutgoingInvoiceList]') IS NOT NULL 
 DROP TABLE [dbo].[BusinessOutgoingInvoiceList] 
 GO
 CREATE TABLE [dbo].[BusinessOutgoingInvoiceList] ( 
 [Id]                 INT              IDENTITY(1,1)          NOT NULL,
 [DocumentNumber]     VARCHAR(20)                             NOT NULL,
 [Supplier]           VARCHAR(512)                            NOT NULL,
 [Customer]           VARCHAR(512)                            NOT NULL,
 [IssueDate]          DATETIME2                               NOT NULL,
 [TaxDate]            DATETIME2                               NOT NULL,
 [MaturityDate]       DATETIME2                               NOT NULL,
 [PaymentMethodId]    INT                                     NOT NULL,
 [MaturityId]         INT                                     NOT NULL,
 [OrderNumber]        VARCHAR(50)                                 NULL,
 [Storned]            BIT                                     NOT NULL,
 [PaymentStatusId]    INT                                     NOT NULL,
 [TotalCurrencyId]    INT                                     NOT NULL,
 [Description]        TEXT                                        NULL,
 [TotalPriceWithVat]  NUMERIC(10,2)                           NOT NULL,
 [ReceiptId]          INT                                         NULL,
 [CreditNoteId]       INT                                         NULL,
 [UserId]             INT                                     NOT NULL,
 [TimeStamp]          DATETIME2                               NOT NULL  CONSTRAINT [DF_OutgoingInvoiceList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_OutgoingInvoiceList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_OutgoingInvoiceList]  UNIQUE      NONCLUSTERED ([DocumentNumber] asc) ,
 CONSTRAINT [FK_OutgoingInvoiceList_CreditNoteList] FOREIGN KEY ([CreditNoteId]) REFERENCES [dbo].[BusinessCreditNoteList] (Id)  ON DELETE SET NULL ,
 CONSTRAINT [FK_OutgoingInvoiceList_CurrencyList] FOREIGN KEY ([TotalCurrencyId]) REFERENCES [dbo].[BasicCurrencyList] (Id) ,
 CONSTRAINT [FK_OutgoingInvoiceList_MaturityList] FOREIGN KEY ([MaturityId]) REFERENCES [dbo].[BusinessMaturityList] (Id) ,
 CONSTRAINT [FK_OutgoingInvoiceList_PaymentMethodList] FOREIGN KEY ([PaymentMethodId]) REFERENCES [dbo].[BusinessPaymentMethodList] (Id) ,
 CONSTRAINT [FK_OutgoingInvoiceList_PaymentStatusList] FOREIGN KEY ([PaymentStatusId]) REFERENCES [dbo].[BusinessPaymentStatusList] (Id) ,
 CONSTRAINT [FK_OutgoingInvoiceList_ReceiptList] FOREIGN KEY ([ReceiptId]) REFERENCES [dbo].[BusinessReceiptList] (Id)  ON DELETE SET NULL ,
 CONSTRAINT [FK_OutgoingInvoiceList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 
 GO
 
 CREATE NONCLUSTERED INDEX [IX_OutgoingInvoiceList_Customer] 
    ON [dbo].[BusinessOutgoingInvoiceList] ([Customer] asc)

TBL BusinessOutgoingInvoiceSupportList

			
 IF OBJECT_ID('[dbo].[BusinessOutgoingInvoiceSupportList]') IS NOT NULL 
 DROP TABLE [dbo].[BusinessOutgoingInvoiceSupportList] 
 GO
 CREATE TABLE [dbo].[BusinessOutgoingInvoiceSupportList] ( 
 [Id]                 INT              IDENTITY(1,1)          NOT NULL,
 [DocumentNumber]     VARCHAR(20)                             NOT NULL,
 [PartNumber]         VARCHAR(50)                                 NULL,
 [Name]               VARCHAR(150)                            NOT NULL,
 [Unit]               VARCHAR(10)                             NOT NULL,
 [PcsPrice]           NUMERIC(10,2)                           NOT NULL,
 [Count]              NUMERIC(10,2)                           NOT NULL,
 [TotalPrice]         NUMERIC(10,2)                           NOT NULL,
 [Vat]                NUMERIC(10,2)                           NOT NULL,
 [TotalPriceWithVat]  NUMERIC(10,2)                           NOT NULL,
 [UserId]             INT                                     NOT NULL,
 [TimeStamp]          DATETIME2                               NOT NULL  CONSTRAINT [DF_OutgoingInvoiceItemList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_OutgoingInvoiceItemList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT [FK_OutgoingInvoiceItemList_OutgoingInvoiceList] FOREIGN KEY ([DocumentNumber]) REFERENCES [dbo].[BusinessOutgoingInvoiceList] (DocumentNumber)  ON DELETE CASCADE ,
 CONSTRAINT [FK_OutgoingInvoiceItemList_UnitList] FOREIGN KEY ([Unit]) REFERENCES [dbo].[BasicUnitList] (Name) ,
 CONSTRAINT [FK_OutgoingInvoiceItemList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 
 GO
 
 CREATE NONCLUSTERED INDEX [IX_OutgoingInvoiceItemList] 
    ON [dbo].[BusinessOutgoingInvoiceSupportList] ([DocumentNumber] asc)

TBL BusinessOutgoingOrderList

			
 IF OBJECT_ID('[dbo].[BusinessOutgoingOrderList]') IS NOT NULL 
 DROP TABLE [dbo].[BusinessOutgoingOrderList] 
 GO
 CREATE TABLE [dbo].[BusinessOutgoingOrderList] ( 
 [Id]                 INT              IDENTITY(1,1)          NOT NULL,
 [DocumentNumber]     VARCHAR(20)                             NOT NULL,
 [Customer]           VARCHAR(512)                            NOT NULL,
 [Supplier]           VARCHAR(512)                            NOT NULL,
 [Storned]            BIT                                     NOT NULL,
 [TotalCurrencyId]    INT                                     NOT NULL,
 [Description]        TEXT                                        NULL,
 [TotalPriceWithVat]  NUMERIC(10,2)                           NOT NULL,
 [UserId]             INT                                     NOT NULL,
 [TimeStamp]          DATETIME2                               NOT NULL  CONSTRAINT [DF_OutgoingOrderList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_OutgoingOrderList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_OutgoingOrderList]  UNIQUE      NONCLUSTERED ([DocumentNumber] asc) ,
 CONSTRAINT [FK_OutgoingOrderList_CurrencyList] FOREIGN KEY ([TotalCurrencyId]) REFERENCES [dbo].[BasicCurrencyList] (Id) ,
 CONSTRAINT [FK_OutgoingOrderList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 
 GO
 
 CREATE NONCLUSTERED INDEX [IX_OutgoingOrderList_Supplier] 
    ON [dbo].[BusinessOutgoingOrderList] ([Supplier] asc)

TBL BusinessOutgoingOrderSupportList

			
 IF OBJECT_ID('[dbo].[BusinessOutgoingOrderSupportList]') IS NOT NULL 
 DROP TABLE [dbo].[BusinessOutgoingOrderSupportList] 
 GO
 CREATE TABLE [dbo].[BusinessOutgoingOrderSupportList] ( 
 [Id]                 INT              IDENTITY(1,1)          NOT NULL,
 [DocumentNumber]     VARCHAR(20)                             NOT NULL,
 [PartNumber]         VARCHAR(50)                                 NULL,
 [Name]               VARCHAR(150)                            NOT NULL,
 [Unit]               VARCHAR(10)                             NOT NULL,
 [PcsPrice]           NUMERIC(10,2)                           NOT NULL,
 [Count]              NUMERIC(10,2)                           NOT NULL,
 [TotalPrice]         NUMERIC(10,2)                           NOT NULL,
 [Vat]                NUMERIC(10,2)                           NOT NULL,
 [TotalPriceWithVat]  NUMERIC(10,2)                           NOT NULL,
 [UserId]             INT                                     NOT NULL,
 [TimeStamp]          DATETIME2                               NOT NULL  CONSTRAINT [DF_OutgoingOrderItemList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_OutgoingOrderItemList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT [FK_OutgoingOrderItemList_OutgoingOrderList] FOREIGN KEY ([DocumentNumber]) REFERENCES [dbo].[BusinessOutgoingOrderList] (DocumentNumber)  ON DELETE CASCADE ,
 CONSTRAINT [FK_OutgoingOrderItemList_UnitList] FOREIGN KEY ([Unit]) REFERENCES [dbo].[BasicUnitList] (Name) ,
 CONSTRAINT [FK_OutgoingOrderItemList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 
 GO
 
 CREATE NONCLUSTERED INDEX [IX_OutgoingOrderItemList] 
    ON [dbo].[BusinessOutgoingOrderSupportList] ([DocumentNumber] asc)

TBL BusinessPaymentMethodList

			
 IF OBJECT_ID('[dbo].[BusinessPaymentMethodList]') IS NOT NULL 
 DROP TABLE [dbo].[BusinessPaymentMethodList] 
 GO
 CREATE TABLE [dbo].[BusinessPaymentMethodList] ( 
 [Id]                    INT              IDENTITY(1,1)          NOT NULL,
 [Name]                  VARCHAR(20)                             NOT NULL,
 [Default]               BIT                                     NOT NULL,
 [Description]           TEXT                                        NULL,
 [AutoGenerateReceipt]   BIT                                     NOT NULL  CONSTRAINT [DF_PaymentMethodList_AutoGenerateReceipt] DEFAULT ((0)),
 [AllowGenerateReceipt]  BIT                                     NOT NULL  CONSTRAINT [DF_PaymentMethodList_AllowGenerateReceipt] DEFAULT ((0)),
 [UserId]                INT                                     NOT NULL,
 [Active]                BIT                                     NOT NULL  CONSTRAINT [DF_PaymentMethodList_Active] DEFAULT ((1)),
 [TimeStamp]             DATETIME2                               NOT NULL  CONSTRAINT [DF_PaymentMethodList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_PaymentMethodList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_PaymentMethodList]  UNIQUE      NONCLUSTERED ([Name] asc) ,
 CONSTRAINT [FK_PaymentMethodList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 
 GO
 
 CREATE   TRIGGER [dbo].[TR_PaymentMethodList] ON [dbo].[BusinessPaymentMethodList]
FOR INSERT, UPDATE, DELETE
AS
DECLARE @Operation VARCHAR(15)
 
IF EXISTS (SELECT 0 FROM inserted)
BEGIN
	DECLARE @setDefault bit;DECLARE @RecId int;
	SET NOCOUNT ON;

    IF EXISTS (SELECT 0 FROM deleted)
    BEGIN --UPDADE
		SELECT @setDefault = ins.[Default] from inserted ins;
		SELECT @RecId = ins.Id from inserted ins;

		IF(@setDefault = 1) BEGIN
			UPDATE [dbo].BusinessPaymentMethodList SET [Default] = 0 WHERE Id <> @RecId; 		
		END
	END ELSE
		BEGIN -- INSERT
			SELECT @setDefault = ins.[Default] from inserted ins;
			SELECT @RecId = ins.Id from inserted ins;

			IF(@setDefault = 1) BEGIN
				UPDATE [dbo].BusinessPaymentMethodList SET [Default] = 0 WHERE Id <> @RecId; 		
			END
		
		END
END ELSE 
BEGIN --DELETE
	SELECT @setDefault = ins.[Default] from deleted ins;
	SELECT @RecId = ins.Id from deleted ins;

	IF(@setDefault = 1) BEGIN
		UPDATE [dbo].BusinessPaymentMethodList SET [Default] = 1  
		WHERE Id IN(SELECT TOP (1) Id FROM [dbo].BusinessPaymentMethodList WHERE Id <> @RecId)
		;
	END
END

 GO

TBL BusinessPaymentStatusList

			
 IF OBJECT_ID('[dbo].[BusinessPaymentStatusList]') IS NOT NULL 
 DROP TABLE [dbo].[BusinessPaymentStatusList] 
 GO
 CREATE TABLE [dbo].[BusinessPaymentStatusList] ( 
 [Id]           INT              IDENTITY(1,1)          NOT NULL,
 [Name]         VARCHAR(50)                             NOT NULL,
 [Default]      BIT                                     NOT NULL,
 [Description]  TEXT                                        NULL,
 [UserId]       INT                                     NOT NULL,
 [Active]       BIT                                     NOT NULL  CONSTRAINT [DF_PaymentStatusList_Active] DEFAULT ((1)),
 [Receipt]      BIT                                     NOT NULL  CONSTRAINT [DF_PaymentStatusList_Receipt] DEFAULT ((0)),
 [CreditNote]   BIT                                     NOT NULL,
 [TimeStamp]    DATETIME2                               NOT NULL  CONSTRAINT [DF_PaymentStatusList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_PaymentStatusList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_PaymentStatusList]  UNIQUE      NONCLUSTERED ([Name] asc) ,
 CONSTRAINT [FK_PaymentStatusList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 
 GO
 
 CREATE   TRIGGER [dbo].[TR_PaymentStatusList] ON [dbo].[BusinessPaymentStatusList]
FOR INSERT, UPDATE, DELETE
AS
DECLARE @Operation VARCHAR(15)
 
IF EXISTS (SELECT 0 FROM inserted)
BEGIN
	DECLARE @setDefault bit;DECLARE @RecId int;
	SET NOCOUNT ON;

    IF EXISTS (SELECT 0 FROM deleted)
    BEGIN --UPDADE
		SELECT @setDefault = ins.[Default] from inserted ins;
		SELECT @RecId = ins.Id from inserted ins;

		IF(@setDefault = 1) BEGIN
			UPDATE [dbo].BusinessPaymentStatusList SET [Default] = 0 WHERE Id <> @RecId; 		
		END
	END ELSE
		BEGIN -- INSERT
			SELECT @setDefault = ins.[Default] from inserted ins;
			SELECT @RecId = ins.Id from inserted ins;

			IF(@setDefault = 1) BEGIN
				UPDATE [dbo].BusinessPaymentStatusList SET [Default] = 0 WHERE Id <> @RecId; 		
			END
		
		END
END ELSE 
BEGIN --DELETE
	SELECT @setDefault = ins.[Default] from deleted ins;
	SELECT @RecId = ins.Id from deleted ins;

	IF(@setDefault = 1) BEGIN
		UPDATE [dbo].BusinessPaymentStatusList SET [Default] = 1  
		WHERE Id IN(SELECT TOP (1) Id FROM [dbo].BusinessPaymentStatusList WHERE Id <> @RecId)
		;
	END
END

 GO
 CREATE   TRIGGER [dbo].[TR_PaymentStatusListCreditNote] ON [dbo].[BusinessPaymentStatusList]
FOR INSERT, UPDATE, DELETE
AS
DECLARE @Operation VARCHAR(15)
 
IF EXISTS (SELECT 0 FROM inserted)
BEGIN
	DECLARE @setCreditNote bit;DECLARE @RecId int;
	SET NOCOUNT ON;

    IF EXISTS (SELECT 0 FROM deleted)
    BEGIN --UPDADE
		SELECT @setCreditNote = ins.[CreditNote] from inserted ins;
		SELECT @RecId = ins.Id from inserted ins;

		IF(@setCreditNote = 1) BEGIN
			UPDATE [dbo].BusinessPaymentStatusList SET [CreditNote] = 0 WHERE Id <> @RecId; 		
		END
	END ELSE
		BEGIN -- INSERT
			SELECT @setCreditNote = ins.[CreditNote] from inserted ins;
			SELECT @RecId = ins.Id from inserted ins;

			IF(@setCreditNote = 1) BEGIN
				UPDATE [dbo].BusinessPaymentStatusList SET [CreditNote] = 0 WHERE Id <> @RecId; 		
			END
		
		END
END ELSE 
BEGIN --DELETE
	SELECT @setCreditNote = ins.[CreditNote] from deleted ins;
	SELECT @RecId = ins.Id from deleted ins;

	IF(@setCreditNote = 1) BEGIN
		UPDATE [dbo].BusinessPaymentStatusList SET [CreditNote] = 1  
		WHERE Id IN(SELECT TOP (1) Id FROM [dbo].BusinessPaymentStatusList WHERE Id <> @RecId)
		;
	END
END

 GO
 
CREATE   TRIGGER [dbo].[TR_PaymentStatusListReceipt] ON [dbo].[BusinessPaymentStatusList]
FOR INSERT, UPDATE, DELETE
AS
DECLARE @Operation VARCHAR(15)
 
IF EXISTS (SELECT 0 FROM inserted)
BEGIN
	DECLARE @setReceipt bit;DECLARE @RecId int;
	SET NOCOUNT ON;

    IF EXISTS (SELECT 0 FROM deleted)
    BEGIN --UPDADE
		SELECT @setReceipt = ins.[Receipt] from inserted ins;
		SELECT @RecId = ins.Id from inserted ins;

		IF(@setReceipt = 1) BEGIN
			UPDATE [dbo].BusinessPaymentStatusList SET [Receipt] = 0 WHERE Id <> @RecId; 		
		END
	END ELSE
		BEGIN -- INSERT
			SELECT @setReceipt = ins.[Receipt] from inserted ins;
			SELECT @RecId = ins.Id from inserted ins;

			IF(@setReceipt = 1) BEGIN
				UPDATE [dbo].BusinessPaymentStatusList SET [Receipt] = 0 WHERE Id <> @RecId; 		
			END
		
		END
END ELSE 
BEGIN --DELETE
	SELECT @setReceipt = ins.[Receipt] from deleted ins;
	SELECT @RecId = ins.Id from deleted ins;

	IF(@setReceipt = 1) BEGIN
		UPDATE [dbo].BusinessPaymentStatusList SET [Receipt] = 1  
		WHERE Id IN(SELECT TOP (1) Id FROM [dbo].BusinessPaymentStatusList WHERE Id <> @RecId)
		;
	END
END

 GO

TBL BusinessReceiptList

			
 IF OBJECT_ID('[dbo].[BusinessReceiptList]') IS NOT NULL 
 DROP TABLE [dbo].[BusinessReceiptList] 
 GO
 CREATE TABLE [dbo].[BusinessReceiptList] ( 
 [Id]                 INT              IDENTITY(1,1)          NOT NULL,
 [DocumentNumber]     VARCHAR(20)                             NOT NULL,
 [InvoiceNumber]      VARCHAR(20)                                 NULL,
 [Supplier]           VARCHAR(512)                            NOT NULL,
 [Customer]           VARCHAR(512)                            NOT NULL,
 [IssueDate]          DATETIME2                               NOT NULL,
 [Storned]            BIT                                     NOT NULL,
 [TotalCurrencyId]    INT                                     NOT NULL,
 [Description]        TEXT                                        NULL,
 [TotalPriceWithVat]  NUMERIC(10,2)                           NOT NULL,
 [UserId]             INT                                     NOT NULL,
 [TimeStamp]          DATETIME2                               NOT NULL  CONSTRAINT [DF_ReceiptList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_ReceiptList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_ReceiptList]  UNIQUE      NONCLUSTERED ([DocumentNumber] asc) ,
 CONSTRAINT [FK_ReceiptList_CurrencyList] FOREIGN KEY ([TotalCurrencyId]) REFERENCES [dbo].[BasicCurrencyList] (Id) ,
 CONSTRAINT [FK_ReceiptList_OutgoingInvoiceList] FOREIGN KEY ([InvoiceNumber]) REFERENCES [dbo].[BusinessOutgoingInvoiceList] (DocumentNumber)  ON DELETE SET NULL ,
 CONSTRAINT [FK_ReceiptList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 

TBL BusinessReceiptSupportList

			
 IF OBJECT_ID('[dbo].[BusinessReceiptSupportList]') IS NOT NULL 
 DROP TABLE [dbo].[BusinessReceiptSupportList] 
 GO
 CREATE TABLE [dbo].[BusinessReceiptSupportList] ( 
 [Id]                 INT              IDENTITY(1,1)          NOT NULL,
 [DocumentNumber]     VARCHAR(20)                             NOT NULL,
 [PartNumber]         VARCHAR(50)                                 NULL,
 [Name]               VARCHAR(150)                            NOT NULL,
 [Unit]               VARCHAR(10)                             NOT NULL,
 [PcsPrice]           NUMERIC(10,2)                           NOT NULL,
 [Count]              NUMERIC(10,2)                           NOT NULL,
 [TotalPrice]         NUMERIC(10,2)                           NOT NULL,
 [Vat]                NUMERIC(10,2)                           NOT NULL,
 [TotalPriceWithVat]  NUMERIC(10,2)                           NOT NULL,
 [UserId]             INT                                     NOT NULL,
 [TimeStamp]          DATETIME2                               NOT NULL  CONSTRAINT [DF_ReceiptItemList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_ReceiptItemList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT [FK_ReceiptItemList_ReceiptList] FOREIGN KEY ([DocumentNumber]) REFERENCES [dbo].[BusinessReceiptList] (DocumentNumber)  ON DELETE CASCADE ,
 CONSTRAINT [FK_ReceiptItemList_UnitList] FOREIGN KEY ([Unit]) REFERENCES [dbo].[BasicUnitList] (Name) ,
 CONSTRAINT [FK_ReceiptItemList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 

TBL BusinessWarehouseList

			
 IF OBJECT_ID('[dbo].[BusinessWarehouseList]') IS NOT NULL 
 DROP TABLE [dbo].[BusinessWarehouseList] 
 GO
 CREATE TABLE [dbo].[BusinessWarehouseList] ( 
 [Id]                   INT              IDENTITY(1,1)          NOT NULL,
 [Name]                 VARCHAR(50)                             NOT NULL,
 [Description]          TEXT                                        NULL,
 [UserId]               INT                                     NOT NULL,
 [AllowNegativeStatus]  BIT                                     NOT NULL,
 [Default]              BIT                                     NOT NULL,
 [LockedByStockTaking]  BIT                                     NOT NULL  CONSTRAINT [DF_WarehouseList_IsLocked] DEFAULT ((0)),
 [LastStockTaking]      DATETIME2                               NOT NULL  CONSTRAINT [DF_WarehouseList_LastStockTaking] DEFAULT (getdate()),
 [Active]               BIT                                     NOT NULL  CONSTRAINT [DF_WarehouseList_Active] DEFAULT ((1)),
 [TimeStamp]            DATETIME2                               NOT NULL  CONSTRAINT [DF_WarehouseList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_WarehouseList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_WarehouseList]  UNIQUE      NONCLUSTERED ([Name] asc) ,
 CONSTRAINT [FK_WarehouseList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 
 GO
 
 CREATE   TRIGGER [dbo].[TR_WarehouseList] ON [dbo].[BusinessWarehouseList]
FOR INSERT, UPDATE, DELETE
AS
DECLARE @Operation VARCHAR(15)
 
IF EXISTS (SELECT 0 FROM inserted)
BEGIN
	DECLARE @setDefault bit;DECLARE @RecId int;
	SET NOCOUNT ON;

    IF EXISTS (SELECT 0 FROM deleted)
    BEGIN --UPDADE
		SELECT @setDefault = ins.[Default] from inserted ins;
		SELECT @RecId = ins.Id from inserted ins;

		IF(@setDefault = 1) BEGIN
			UPDATE [dbo].BusinessWarehouseList SET [Default] = 0 WHERE Id <> @RecId; 		
		END
	END ELSE
		BEGIN -- INSERT
			SELECT @setDefault = ins.[Default] from inserted ins;
			SELECT @RecId = ins.Id from inserted ins;

			IF(@setDefault = 1) BEGIN
				UPDATE [dbo].BusinessWarehouseList SET [Default] = 0 WHERE Id <> @RecId; 		
			END
		
		END
END ELSE 
BEGIN --DELETE
	SELECT @setDefault = ins.[Default] from deleted ins;
	SELECT @RecId = ins.Id from deleted ins;

	IF(@setDefault = 1) BEGIN
		UPDATE [dbo].BusinessWarehouseList SET [Default] = 1  
		WHERE Id IN(SELECT TOP (1) Id FROM [dbo].BusinessWarehouseList WHERE Id <> @RecId)
		;
	END
END

 GO

TBL DocSrvDocTemplateList

			
 IF OBJECT_ID('[dbo].[DocSrvDocTemplateList]') IS NOT NULL 
 DROP TABLE [dbo].[DocSrvDocTemplateList] 
 GO
 CREATE TABLE [dbo].[DocSrvDocTemplateList] ( 
 [Id]                 INT              IDENTITY(1,1)          NOT NULL,
 [InheritedCodeType]  VARCHAR(50)                             NOT NULL,
 [GroupId]            INT                                     NOT NULL,
 [Sequence]           INT                                     NOT NULL,
 [Name]               VARCHAR(50)                             NOT NULL,
 [Description]        TEXT                                        NULL,
 [Template]           VARCHAR(max)                                NULL,
 [UserId]             INT                                     NOT NULL,
 [TimeStamp]          DATETIME2                               NOT NULL  CONSTRAINT [DF_DocSrvDocTemplateList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_DocSrvDocTemplateList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_DocSrvDocTemplateList]  UNIQUE      NONCLUSTERED ([Name] asc) ,
 CONSTRAINT [FK_DocSrvDocTemplateList_DocSrvDocumentationGroupList] FOREIGN KEY ([GroupId]) REFERENCES [dbo].[DocSrvDocumentationGroupList] (Id) ,
 CONSTRAINT [FK_DocSrvDocTemplateList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 

TBL DocSrvDocumentationCodeLibraryList

			
 IF OBJECT_ID('[dbo].[DocSrvDocumentationCodeLibraryList]') IS NOT NULL 
 DROP TABLE [dbo].[DocSrvDocumentationCodeLibraryList] 
 GO
 CREATE TABLE [dbo].[DocSrvDocumentationCodeLibraryList] ( 
 [Id]           INT              IDENTITY(1,1)          NOT NULL,
 [Name]         VARCHAR(50)                             NOT NULL,
 [Description]  VARCHAR(2096)                               NULL,
 [MdContent]    TEXT                                    NOT NULL,
 [HtmlContent]  TEXT                                    NOT NULL,
 [UserId]       INT                                     NOT NULL,
 [TimeStamp]    DATETIME2                               NOT NULL  CONSTRAINT [DF_DocumentationCodeLibraryList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_DocumentationCodeLibraryList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_DocumentationCodeLibraryList]  UNIQUE      NONCLUSTERED ([Name] asc) ,
 CONSTRAINT [FK_DocumentationCodeLibraryList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 

TBL DocSrvDocumentationGroupList

			
 IF OBJECT_ID('[dbo].[DocSrvDocumentationGroupList]') IS NOT NULL 
 DROP TABLE [dbo].[DocSrvDocumentationGroupList] 
 GO
 CREATE TABLE [dbo].[DocSrvDocumentationGroupList] ( 
 [Id]           INT              IDENTITY(1,1)          NOT NULL,
 [Name]         VARCHAR(50)                             NOT NULL,
 [Sequence]     INT                                     NOT NULL,
 [Description]  TEXT                                        NULL,
 [UserId]       INT                                     NOT NULL,
 [Active]       BIT                                     NOT NULL  CONSTRAINT [DF_DocumentationGroupList_Active] DEFAULT ((1)),
 [TimeStamp]    DATETIME2                               NOT NULL  CONSTRAINT [DF_DocumentationGroupList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_DocumentationGroupList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_DocumentationGroupList]  UNIQUE      NONCLUSTERED ([Name] asc) ,
 CONSTRAINT [FK_DocumentationGroupList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 

TBL DocSrvDocumentationList

			
 IF OBJECT_ID('[dbo].[DocSrvDocumentationList]') IS NOT NULL 
 DROP TABLE [dbo].[DocSrvDocumentationList] 
 GO
 CREATE TABLE [dbo].[DocSrvDocumentationList] ( 
 [Id]                    INT              IDENTITY(1,1)          NOT NULL,
 [DocumentationGroupId]  INT                                     NOT NULL,
 [Name]                  VARCHAR(150)                            NOT NULL,
 [Sequence]              INT                                     NOT NULL,
 [Description]           TEXT                                        NULL,
 [MdContent]             TEXT                                    NOT NULL,
 [HtmlContent]           TEXT                                    NOT NULL,
 [UserId]                INT                                     NOT NULL,
 [Active]                BIT                                     NOT NULL  CONSTRAINT [DF_DocumentationList_Active] DEFAULT ((1)),
 [AutoVersion]           INT                                     NOT NULL,
 [TimeStamp]             DATETIME2                               NOT NULL  CONSTRAINT [DF_DocumentationList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_DocumentationList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_DocumentationList]  UNIQUE      NONCLUSTERED ([Name] asc, [DocumentationGroupId] asc, [AutoVersion] asc, [TimeStamp] asc) ,
 CONSTRAINT [FK_DocumentationList_DocumentationGroupList] FOREIGN KEY ([DocumentationGroupId]) REFERENCES [dbo].[DocSrvDocumentationGroupList] (Id) ,
 CONSTRAINT [FK_DocumentationList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 
 GO
 
 CREATE   TRIGGER [dbo].[TR_DocumentationList] ON [dbo].[DocSrvDocumentationList]
FOR INSERT, UPDATE--, DELETE
AS
DECLARE @Operation VARCHAR(15)
 
IF EXISTS (SELECT 0 FROM inserted)
BEGIN
	DECLARE @setActive bit;DECLARE @autoVersion int;DECLARE @RecId int;DECLARE @GroupId int;DECLARE @RecName varchar(150);
	DECLARE @autoRemoveOld bit; DECLARE @UserId int;
	

	SET @autoVersion = 0;SET @setActive = 1;SET @autoRemoveOld = 0;
	SET NOCOUNT ON;

    IF EXISTS (SELECT 0 FROM deleted)
    BEGIN --UPDADE
		SELECT @setActive = ins.[Active] from inserted ins;
		SELECT @RecId = ins.Id from inserted ins;
		SELECT @UserId = ins.UserId from inserted ins;
		SELECT @GroupId = ins.DocumentationGroupId from inserted ins;
		SELECT @RecName = ins.[Name] from inserted ins;

		--GET AutoRemoveSetting
		SELECT @autoRemoveOld = CAST(CAST(SUBSTRING(ss.[Value],1,10) as varchar(10)) as bit) FROM [dbo].[ServerSettingList] ss WHERE ss.[Key] = 'ServerDocsOldAutoRemoveEnabled';

		IF(@setActive = 1) BEGIN
			UPDATE [dbo].DocSrvDocumentationList SET [Active] = 0 WHERE Id <> @RecId AND [Name] = @RecName AND [DocumentationGroupId] = @GroupId; 		
		END

		--AutoRemove Older versions
		IF(@autoRemoveOld = 1) BEGIN
			DELETE FROM  [dbo].DocSrvDocumentationList WHERE Id <> @RecId AND [Name] = @RecName AND [DocumentationGroupId] = @GroupId; 		
		END

	END ELSE
		BEGIN -- INSERT
			SELECT @setActive = ins.[Active] from inserted ins;
			SELECT @RecId = ins.Id from inserted ins;
			SELECT @UserId = ins.UserId from inserted ins;
			SELECT @GroupId = ins.DocumentationGroupId from inserted ins;
			SELECT @RecName = ins.[Name] from inserted ins;

			--GET AutoRemoveSetting
			SELECT @autoRemoveOld = CAST(CAST(SUBSTRING(ss.[Value],1,10) as varchar(10)) as bit) FROM [dbo].[ServerSettingList] ss WHERE ss.[Key] = 'ServerDocsOldAutoRemoveEnabled';

			--AutoVersioning
			SELECT @autoVersion = MAX(d.[AutoVersion]) + 1 FROM [dbo].DocSrvDocumentationList d WHERE d.[Name] = @RecName AND [DocumentationGroupId] = @GroupId;
			IF (@autoVersion = 0 ) BEGIN SET @autoVersion = 1; END
			UPDATE [dbo].DocSrvDocumentationList SET [AutoVersion] = @autoVersion WHERE Id = @RecId AND [DocumentationGroupId] = @GroupId;

			IF(@setActive = 1) BEGIN
				UPDATE [dbo].DocSrvDocumentationList SET [Active] = 0 WHERE Id <> @RecId AND [Name] = @RecName AND [DocumentationGroupId] = @GroupId; 		
			END
			
			--AutoRemove Older versions
			IF(@autoRemoveOld = 1) BEGIN
				DELETE FROM  [dbo].DocSrvDocumentationList WHERE Id <> @RecId AND [Name] = @RecName AND [DocumentationGroupId] = @GroupId; 		
			END
		END
END

 GO

TBL GithubSrvAuthLogList

			
 IF OBJECT_ID('[dbo].[GithubSrvAuthLogList]') IS NOT NULL 
 DROP TABLE [dbo].[GithubSrvAuthLogList] 
 GO
 CREATE TABLE [dbo].[GithubSrvAuthLogList] ( 
 [Id]         INT              IDENTITY(1,1)          NOT NULL,
 [IssueDate]  DATETIME2                               NOT NULL,
 [Expires]    DATETIME2                               NOT NULL,
 [IssueIp]    NVARCHAR(max)                               NULL,
 [LastIp]     NVARCHAR(max)                               NULL,
 [IsValid]    BIT                                     NOT NULL,
 [UserId]     INT                                     NOT NULL,
 [TimeStamp]  DATETIME2                               NOT NULL  CONSTRAINT [DF_GithubSrvAuthLogList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_GithubSrvAuthLogList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT [FK_GithubSrvAuthLogList_UserId] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id)  ON DELETE CASCADE )
 
 
 GO
 
 CREATE NONCLUSTERED INDEX [IX_GithubSrvAuthLogList_UserId] 
    ON [dbo].[GithubSrvAuthLogList] ([UserId] asc)

TBL GithubSrvRepositoryList

			
 IF OBJECT_ID('[dbo].[GithubSrvRepositoryList]') IS NOT NULL 
 DROP TABLE [dbo].[GithubSrvRepositoryList] 
 GO
 CREATE TABLE [dbo].[GithubSrvRepositoryList] ( 
 [Id]             INT              IDENTITY(1,1)          NOT NULL,
 [UserId]         INT                                     NOT NULL,
 [UserName]       VARCHAR(150)                                NULL,
 [Name]           VARCHAR(150)                                NULL,
 [Description]    TEXT                                        NULL,
 [DefaultBranch]  VARCHAR(1024)                               NULL,
 [NumIssues]      INT                                     NOT NULL,
 [NumOpenIssues]  INT                                     NOT NULL,
 [NumPulls]       INT                                     NOT NULL,
 [NumOpenPulls]   INT                                     NOT NULL,
 [CreationDate]   DATETIME2                               NOT NULL,
 [IsPrivate]      BIT                                     NOT NULL,
 [IsMirror]       BIT                                     NOT NULL,
 [Size]           BIGINT                                  NOT NULL,
 [UpdateTime]     DATETIME2                               NOT NULL,
 [TimeStamp]      DATETIME2                               NOT NULL  CONSTRAINT [DF_GithubSrvRepositoryList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_GithubSrvRepositoryList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT [FK_GithubSrvRepositoryList_SolutionUserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 

TBL GithubSrvSshKeyList

			
 IF OBJECT_ID('[dbo].[GithubSrvSshKeyList]') IS NOT NULL 
 DROP TABLE [dbo].[GithubSrvSshKeyList] 
 GO
 CREATE TABLE [dbo].[GithubSrvSshKeyList] ( 
 [Id]           INT              IDENTITY(1,1)          NOT NULL,
 [UserId]       INT                                     NOT NULL,
 [KeyType]      NVARCHAR(max)                               NULL,
 [Fingerprint]  NVARCHAR(max)                               NULL,
 [PublicKey]    NVARCHAR(max)                               NULL,
 [ImportData]   DATETIME2                               NOT NULL,
 [LastUse]      DATETIME2                               NOT NULL,
 [TimeStamp]    DATETIME2                               NOT NULL  CONSTRAINT [DF_GithubSrvSshKeyList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_GithubSrvSshKeyList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT [FK_GithubSrvSshKeyList_UserId] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id)  ON DELETE CASCADE )
 
 
 GO
 
 CREATE NONCLUSTERED INDEX [IX_GithubSrvSshKeyList_UserId] 
    ON [dbo].[GithubSrvSshKeyList] ([UserId] asc)

TBL GithubSrvTeamList

			
 IF OBJECT_ID('[dbo].[GithubSrvTeamList]') IS NOT NULL 
 DROP TABLE [dbo].[GithubSrvTeamList] 
 GO
 CREATE TABLE [dbo].[GithubSrvTeamList] ( 
 [Id]            INT              IDENTITY(1,1)          NOT NULL,
 [Name]          VARCHAR(150)                                NULL,
 [Description]   TEXT                                        NULL,
 [CreationDate]  DATETIME2                               NOT NULL,
 [TimeStamp]     DATETIME2                               NOT NULL  CONSTRAINT [DF_GithubSrvTeamList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_GithubSrvTeamList]  PRIMARY KEY CLUSTERED    ([Id] asc) )
 
 

TBL GithubSrvTeamRepositoryRoleList

			
 IF OBJECT_ID('[dbo].[GithubSrvTeamRepositoryRoleList]') IS NOT NULL 
 DROP TABLE [dbo].[GithubSrvTeamRepositoryRoleList] 
 GO
 CREATE TABLE [dbo].[GithubSrvTeamRepositoryRoleList] ( 
 [Id]            INT              IDENTITY(1,1)          NOT NULL,
 [TeamId]        INT                                     NOT NULL,
 [RepositoryId]  INT                                     NOT NULL,
 [AllowRead]     BIT                                     NOT NULL,
 [AllowWrite]    BIT                                     NOT NULL,
 [TimeStamp]     DATETIME2                               NOT NULL  CONSTRAINT [DF_GithubSrvTeamRepositoryRoleList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_GithubSrvTeamRepositoryRoleList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_GithubSrvTeamRepositoryRoleList]  UNIQUE      NONCLUSTERED ([TeamId] asc, [RepositoryId] asc) ,
 CONSTRAINT [FK_GithubSrvTeamRepositoryRoleList_RepositoryId] FOREIGN KEY ([RepositoryId]) REFERENCES [dbo].[GithubSrvRepositoryList] (Id)  ON DELETE CASCADE ,
 CONSTRAINT [FK_GithubSrvTeamRepositoryRoleList_TeamId] FOREIGN KEY ([TeamId]) REFERENCES [dbo].[GithubSrvTeamList] (Id)  ON DELETE CASCADE )
 
 
 GO
 
 CREATE NONCLUSTERED INDEX [IX_GithubSrvTeamRepositoryRoleList_RepositoryId] 
    ON [dbo].[GithubSrvTeamRepositoryRoleList] ([RepositoryId] asc)

TBL GithubSrvUserTeamRoleList

			
 IF OBJECT_ID('[dbo].[GithubSrvUserTeamRoleList]') IS NOT NULL 
 DROP TABLE [dbo].[GithubSrvUserTeamRoleList] 
 GO
 CREATE TABLE [dbo].[GithubSrvUserTeamRoleList] ( 
 [Id]         INT              IDENTITY(1,1)          NOT NULL,
 [TeamId]     INT                                     NOT NULL,
 [IsAdmin]    BIT                                     NOT NULL,
 [UserId]     INT                                     NOT NULL,
 [TimeStamp]  DATETIME2                               NOT NULL  CONSTRAINT [DF_GithubSrvUserTeamRoleList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_GithubSrvUserTeamRoleList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_GithubSrvUserTeamRoleList]  UNIQUE      NONCLUSTERED ([TeamId] asc, [UserId] asc) ,
 CONSTRAINT [FK_GithubSrvUserTeamRoleList_TeamId] FOREIGN KEY ([TeamId]) REFERENCES [dbo].[GithubSrvTeamList] (Id)  ON DELETE CASCADE ,
 CONSTRAINT [FK_GithubSrvUserTeamRoleList_UserId] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id)  ON DELETE CASCADE )
 
 
 GO
 
 CREATE NONCLUSTERED INDEX [IX_GithubSrvUserTeamRoleList_TeamId] 
    ON [dbo].[GithubSrvUserTeamRoleList] ([TeamId] asc)

TBL LicSrvLicenseActivationFailList

			
 IF OBJECT_ID('[dbo].[LicSrvLicenseActivationFailList]') IS NOT NULL 
 DROP TABLE [dbo].[LicSrvLicenseActivationFailList] 
 GO
 CREATE TABLE [dbo].[LicSrvLicenseActivationFailList] ( 
 [Id]          INT              IDENTITY(1,1)          NOT NULL,
 [IpAddress]   VARCHAR(50)                             NOT NULL,
 [UnlockCode]  VARCHAR(50)                                 NULL,
 [PartNumber]  VARCHAR(50)                                 NULL,
 [TimeStamp]   DATETIME2                               NOT NULL  CONSTRAINT [DF_LicenceActivationFailList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_LicenseActivationFailList]  PRIMARY KEY CLUSTERED    ([Id] asc) )
 
 
 GO
 
 CREATE NONCLUSTERED INDEX [IX_LicenseActivationFailList_PartNumber] 
    ON [dbo].[LicSrvLicenseActivationFailList] ([PartNumber] asc)
 CREATE NONCLUSTERED INDEX [IX_LicenseActivationFailList_IpAddress] 
    ON [dbo].[LicSrvLicenseActivationFailList] ([IpAddress] asc)

TBL LicSrvLicenseAlgorithmList

			
 IF OBJECT_ID('[dbo].[LicSrvLicenseAlgorithmList]') IS NOT NULL 
 DROP TABLE [dbo].[LicSrvLicenseAlgorithmList] 
 GO
 CREATE TABLE [dbo].[LicSrvLicenseAlgorithmList] ( 
 [Id]               INT              IDENTITY(1,1)          NOT NULL,
 [AddressId]        INT                                     NOT NULL,
 [ItemId]           INT                                     NOT NULL,
 [Name]             VARCHAR(30)                             NOT NULL,
 [ValidFrom]        DATE                                        NULL,
 [ValidTo]          DATE                                        NULL,
 [Algorithm]        VARCHAR(2000)                           NOT NULL,
 [Description]      TEXT                                        NULL,
 [LimitActive]      BIT                                     NOT NULL,
 [ActivationLimit]  INT                                         NULL,
 [UsedCount]        INT                                     NOT NULL,
 [Active]           BIT                                     NOT NULL,
 [UserId]           INT                                     NOT NULL,
 [TimeStamp]        DATETIME2                               NOT NULL  CONSTRAINT [DF_LicSrvLicenseAlgorithmList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_LicSrvLicenseAlgorithmList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_LicSrvLicenseAlgorithmList]  UNIQUE      NONCLUSTERED ([Name] asc) ,
 CONSTRAINT [FK_LicenseAlgorithmList_AddressList] FOREIGN KEY ([AddressId]) REFERENCES [dbo].[BusinessAddressList] (Id) ,
 CONSTRAINT [FK_LicenseAlgorithmList_ItemList] FOREIGN KEY ([ItemId]) REFERENCES [dbo].[BasicItemList] (Id) ,
 CONSTRAINT [FK_LicenseAlgorithmList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 

TBL LicSrvUsedLicenseList

			
 IF OBJECT_ID('[dbo].[LicSrvUsedLicenseList]') IS NOT NULL 
 DROP TABLE [dbo].[LicSrvUsedLicenseList] 
 GO
 CREATE TABLE [dbo].[LicSrvUsedLicenseList] ( 
 [Id]             INT              IDENTITY(1,1)          NOT NULL,
 [AlgorithmName]  VARCHAR(30)                             NOT NULL,
 [PartNumber]     VARCHAR(50)                             NOT NULL,
 [UnlockCode]     VARCHAR(50)                             NOT NULL,
 [AddressId]      INT                                     NOT NULL,
 [ItemId]         INT                                     NOT NULL,
 [License]        VARCHAR(50)                             NOT NULL,
 [ActivateDate]   DATETIME2                               NOT NULL  CONSTRAINT [DF_UsedLicenceList_ActivateDate] DEFAULT (getdate()),
 [IpAddress]      VARCHAR(50)                             NOT NULL,
 CONSTRAINT   [PK_UsedLicenseList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT [FK_UsedLicenseList_AddressList] FOREIGN KEY ([AddressId]) REFERENCES [dbo].[BusinessAddressList] (Id) ,
 CONSTRAINT [FK_UsedLicenseList_ItemList] FOREIGN KEY ([ItemId]) REFERENCES [dbo].[BasicItemList] (Id) )
 
 

TBL ProdGuidGroupList

			
 IF OBJECT_ID('[dbo].[ProdGuidGroupList]') IS NOT NULL 
 DROP TABLE [dbo].[ProdGuidGroupList] 
 GO
 CREATE TABLE [dbo].[ProdGuidGroupList] ( 
 [Id]         INT              IDENTITY(1,1)          NOT NULL,
 [Name]       VARCHAR(50)                             NOT NULL,
 [UserId]     INT                                     NOT NULL,
 [Timestamp]  DATETIME2                               NOT NULL,
 CONSTRAINT   [PK_ProdGuidGroupList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_ProdGuidGroupList]  UNIQUE      NONCLUSTERED ([Name] asc) ,
 CONSTRAINT [FK_ProdGuidGroupList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 

TBL ProdGuidOperationList

			
 IF OBJECT_ID('[dbo].[ProdGuidOperationList]') IS NOT NULL 
 DROP TABLE [dbo].[ProdGuidOperationList] 
 GO
 CREATE TABLE [dbo].[ProdGuidOperationList] ( 
 [Id]               INT              IDENTITY(1,1)          NOT NULL,
 [WorkPlace]        INT                                     NOT NULL,
 [PartNumber]       VARCHAR(50)                             NOT NULL,
 [OperationNumber]  INT                                     NOT NULL,
 [Note]             VARCHAR(100)                            NOT NULL,
 [PcsPerHour]       INT                                     NOT NULL,
 [KcPerKs]          NUMERIC(10,4)                           NOT NULL,
 [UserId]           INT                                     NOT NULL,
 [Timestamp]        DATETIME2                               NOT NULL,
 CONSTRAINT   [PK_ProdGuidOperationList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_ProdGuidOperationList]  UNIQUE      NONCLUSTERED ([WorkPlace] asc, [OperationNumber] asc) ,
 CONSTRAINT [FK_ProdGuidOperationList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 

TBL ProdGuidPartList

			
 IF OBJECT_ID('[dbo].[ProdGuidPartList]') IS NOT NULL 
 DROP TABLE [dbo].[ProdGuidPartList] 
 GO
 CREATE TABLE [dbo].[ProdGuidPartList] ( 
 [Id]         INT              IDENTITY(1,1)          NOT NULL,
 [WorkPlace]  INT                                     NOT NULL,
 [Number]     VARCHAR(50)                             NOT NULL,
 [Name]       VARCHAR(100)                                NULL,
 [UserId]     INT                                     NOT NULL,
 [Timestamp]  DATETIME2                               NOT NULL,
 CONSTRAINT   [PK_ProdGuidPartList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_ProdGuidPartList]  UNIQUE      NONCLUSTERED ([WorkPlace] asc, [Number] asc) ,
 CONSTRAINT [FK_ProdGuidPartList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 

TBL ProdGuidPersonList

			
 IF OBJECT_ID('[dbo].[ProdGuidPersonList]') IS NOT NULL 
 DROP TABLE [dbo].[ProdGuidPersonList] 
 GO
 CREATE TABLE [dbo].[ProdGuidPersonList] ( 
 [Id]              INT              IDENTITY(1,1)          NOT NULL,
 [GroupId]         INT                                     NOT NULL,
 [PersonalNumber]  INT                                     NOT NULL,
 [Name]            VARCHAR(50)                             NOT NULL,
 [SurName]         VARCHAR(100)                            NOT NULL,
 [UserId]          INT                                     NOT NULL,
 [Timestamp]       DATETIME2                               NOT NULL,
 CONSTRAINT   [PK_ProdGuidPersonList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_ProdGuidPersonList]  UNIQUE      NONCLUSTERED ([PersonalNumber] asc) ,
 CONSTRAINT [FK_ProdGuidPersonList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 

TBL ProdGuidWorkList

			
 IF OBJECT_ID('[dbo].[ProdGuidWorkList]') IS NOT NULL 
 DROP TABLE [dbo].[ProdGuidWorkList] 
 GO
 CREATE TABLE [dbo].[ProdGuidWorkList] ( 
 [Id]               INT              IDENTITY(1,1)          NOT NULL,
 [Date]             DATETIME2                               NOT NULL,
 [PersonalNumber]   INT                                     NOT NULL,
 [WorkPlace]        INT                                     NOT NULL,
 [OperationNumber]  INT                                     NOT NULL,
 [WorkTime]         TIME                                    NOT NULL,
 [Pcs]              INT                                     NOT NULL,
 [Amount]           NUMERIC(10,2)                           NOT NULL,
 [WorkPower]        NUMERIC(10,2)                           NOT NULL,
 [UserId]           INT                                     NOT NULL,
 [Timestamp]        DATETIME2                               NOT NULL,
 CONSTRAINT   [PK_ProdGuidWorkList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT [FK_ProdGuidWorkList_ProdGuidPersonList] FOREIGN KEY ([PersonalNumber]) REFERENCES [dbo].[ProdGuidPersonList] (PersonalNumber) ,
 CONSTRAINT [FK_ProdGuidWorkList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 

TBL ProviderAutoGenServerReqList

			
 IF OBJECT_ID('[dbo].[ProviderAutoGenServerReqList]') IS NOT NULL 
 DROP TABLE [dbo].[ProviderAutoGenServerReqList] 
 GO
 CREATE TABLE [dbo].[ProviderAutoGenServerReqList] ( 
 [Id]           INT              IDENTITY(1,1)          NOT NULL,
 [IpAddress]    VARCHAR(20)                             NOT NULL,
 [Name]         VARCHAR(100)                            NOT NULL,
 [Description]  TEXT                                        NULL,
 [UserId]       INT                                         NULL,
 [TimeStamp]    DATETIME2                               NOT NULL  CONSTRAINT [DF_ProviderAutoGenServerCreateRequest_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_ProviderAutoGenServerCreateRequest]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_ProviderAutoGenServerCreateRequest]  UNIQUE      NONCLUSTERED ([Name] asc) ,
 CONSTRAINT [FK_ProviderAutoGenServerCreateRequest_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 

TBL ProviderGeneratedLicenseList

			
 IF OBJECT_ID('[dbo].[ProviderGeneratedLicenseList]') IS NOT NULL 
 DROP TABLE [dbo].[ProviderGeneratedLicenseList] 
 GO
 CREATE TABLE [dbo].[ProviderGeneratedLicenseList] ( 
 [Id]           INT              IDENTITY(1,1)          NOT NULL,
 [PartNumber]   VARCHAR(50)                             NOT NULL,
 [Type]         VARCHAR(50)                             NOT NULL,
 [Expiration]   DATETIME2                               NOT NULL,
 [Description]  TEXT                                        NULL,
 [UserId]       INT                                     NOT NULL,
 [TimeStamp]    DATETIME2                               NOT NULL  CONSTRAINT [DF_ProviderGeneratedLicenseList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_ProviderGeneratedLicenseList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_ProviderGeneratedLicenseList]  UNIQUE      NONCLUSTERED ([PartNumber] asc) ,
 CONSTRAINT [FK_ProviderGeneratedLicenseList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 

TBL ProviderGeneratedToolList

			
 IF OBJECT_ID('[dbo].[ProviderGeneratedToolList]') IS NOT NULL 
 DROP TABLE [dbo].[ProviderGeneratedToolList] 
 GO
 CREATE TABLE [dbo].[ProviderGeneratedToolList] ( 
 [Id]           INT              IDENTITY(1,1)          NOT NULL,
 [Name]         VARCHAR(50)                             NOT NULL,
 [Description]  TEXT                                        NULL,
 [UserId]       INT                                     NOT NULL,
 [Rating]       INT                                         NULL,
 [DescActive]   BIT                                     NOT NULL,
 [TimeStamp]    DATETIME2                               NOT NULL  CONSTRAINT [DF_GeneratedToolList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_GeneratedToolList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT [FK_GeneratedToolList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 
 GO
 
 CREATE NONCLUSTERED INDEX [IX_GeneratedToolList] 
    ON [dbo].[ProviderGeneratedToolList] ([Name] asc, [UserId] asc)
 CREATE NONCLUSTERED INDEX [IX_GeneratedToolList_1] 
    ON [dbo].[ProviderGeneratedToolList] ([Name] asc)
 CREATE NONCLUSTERED INDEX [IX_GeneratedToolList_2] 
    ON [dbo].[ProviderGeneratedToolList] ([UserId] asc)

TBL ProviderViewGeneratedToolRatingList

			
IF OBJECT_ID('[dbo].[ProviderViewGeneratedToolRatingList]') IS NOT NULL 
 DROP  VIEW      [dbo].[ProviderViewGeneratedToolRatingList] 
 GO
 CREATE VIEW dbo.ProviderViewGeneratedToolRatingList
AS
SELECT        Name, AVG(Rating) AS Rating, COUNT(Id) AS CountRating,
                             (SELECT        COUNT(Id) AS Expr1
                               FROM            dbo.ProviderGeneratedToolList AS gt
                               WHERE        (Name = g.Name)) AS TotalCount
FROM            dbo.ProviderGeneratedToolList AS g
WHERE        (Rating IS NOT NULL)
GROUP BY Name

GO


TBL ServerApiSecurityList

			
 IF OBJECT_ID('[dbo].[ServerApiSecurityList]') IS NOT NULL 
 DROP TABLE [dbo].[ServerApiSecurityList] 
 GO
 CREATE TABLE [dbo].[ServerApiSecurityList] ( 
 [Id]                     INT              IDENTITY(1,1)          NOT NULL,
 [InheritedApiType]       VARCHAR(50)                             NOT NULL,
 [Name]                   VARCHAR(50)                             NOT NULL,
 [Description]            TEXT                                        NULL,
 [UrlSubPath]             VARCHAR(100)                                NULL,
 [WriteAllowedRoles]      VARCHAR(500)                                NULL,
 [ReadAllowedRoles]       VARCHAR(500)                                NULL,
 [WriteRestrictedAccess]  BIT                                     NOT NULL,
 [ReadRestrictedAccess]   BIT                                     NOT NULL  CONSTRAINT [DF_ServerApiSecurityList_ReadRestrictedAccess] DEFAULT ((0)),
 [RedirectPathOnError]    VARCHAR(100)                                NULL,
 [Active]                 BIT                                     NOT NULL  CONSTRAINT [DF_ServerApiSecurityList_Active] DEFAULT ((1)),
 [UserId]                 INT                                     NOT NULL,
 [TimeStamp]              DATETIME2                               NOT NULL  CONSTRAINT [DF_ServerApiSecurityList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_ServerApiSecurityList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_ServerApiSecurityList_2]  UNIQUE      NONCLUSTERED ([UrlSubPath] asc) ,
 CONSTRAINT   [IX_ServerApiSecurityList]  UNIQUE      NONCLUSTERED ([Name] asc) ,
 CONSTRAINT [FK_ServerApiSecurityList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 

TBL ServerCorsDefAllowedOriginList

			
 IF OBJECT_ID('[dbo].[ServerCorsDefAllowedOriginList]') IS NOT NULL 
 DROP TABLE [dbo].[ServerCorsDefAllowedOriginList] 
 GO
 CREATE TABLE [dbo].[ServerCorsDefAllowedOriginList] ( 
 [Id]             INT              IDENTITY(1,1)          NOT NULL,
 [AllowedDomain]  VARCHAR(50)                             NOT NULL,
 [Description]    TEXT                                        NULL,
 [UserId]         INT                                     NOT NULL,
 [Active]         BIT                                     NOT NULL  CONSTRAINT [DF_ServerCorsDefAllowedOriginList_Active] DEFAULT ((1)),
 [TimeStamp]      DATETIME2                               NOT NULL  CONSTRAINT [DF_ServerCorsDefAllowedOriginList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_ServerCorsDefAllowedOriginList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_ServerCorsDefAllowedOriginList]  UNIQUE      NONCLUSTERED ([AllowedDomain] asc) ,
 CONSTRAINT [FK_ServerCorsDefAllowedOriginList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 

TBL ServerHealthCheckTaskList

			
 IF OBJECT_ID('[dbo].[ServerHealthCheckTaskList]') IS NOT NULL 
 DROP TABLE [dbo].[ServerHealthCheckTaskList] 
 GO
 CREATE TABLE [dbo].[ServerHealthCheckTaskList] ( 
 [Id]               INT              IDENTITY(1,1)          NOT NULL,
 [TaskName]         VARCHAR(100)                            NOT NULL,
 [Type]             VARCHAR(50)                             NOT NULL,
 [ServerDrive]      VARCHAR(50)                                 NULL,
 [FolderPath]       VARCHAR(1024)                               NULL,
 [DbSqlConnection]  VARCHAR(1024)                               NULL,
 [IpAddress]        VARCHAR(20)                                 NULL,
 [ServerUrlPath]    VARCHAR(1024)                               NULL,
 [UrlPath]          VARCHAR(1024)                               NULL,
 [SizeMB]           INT                                         NULL,
 [Port]             INT                                         NULL,
 [UserId]           INT                                     NOT NULL,
 [Active]           BIT                                     NOT NULL  CONSTRAINT [DF_HealthCheckTaskList_Active] DEFAULT ((1)),
 [Timestamp]        DATETIME2                               NOT NULL  CONSTRAINT [DF_HealthCheckTaskList_Timestamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_HealthCheckTaskList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_HealthCheckTaskList]  UNIQUE      NONCLUSTERED ([TaskName] asc) ,
 CONSTRAINT [FK_HealthCheckTaskList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 

TBL ServerLiveDataMonitorList

			
 IF OBJECT_ID('[dbo].[ServerLiveDataMonitorList]') IS NOT NULL 
 DROP TABLE [dbo].[ServerLiveDataMonitorList] 
 GO
 CREATE TABLE [dbo].[ServerLiveDataMonitorList] ( 
 [Id]              INT              IDENTITY(1,1)          NOT NULL,
 [RootPath]        VARCHAR(1024)                           NOT NULL,
 [FileExtensions]  VARCHAR(1024)                           NOT NULL,
 [Description]     TEXT                                        NULL,
 [UserId]          INT                                     NOT NULL,
 [Active]          BIT                                     NOT NULL  CONSTRAINT [DF_ServerLiveDataMonitorList_Active] DEFAULT ((1)),
 [TimeStamp]       DATETIME2                               NOT NULL  CONSTRAINT [DF_ServerLiveDataMonitorList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_ServerLiveDataMonitorList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_ServerLiveDataMonitorList]  UNIQUE      NONCLUSTERED ([RootPath] asc) ,
 CONSTRAINT [FK_ServerLiveDataMonitorList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 

TBL ServerModuleAndServiceList

			
 IF OBJECT_ID('[dbo].[ServerModuleAndServiceList]') IS NOT NULL 
 DROP TABLE [dbo].[ServerModuleAndServiceList] 
 GO
 CREATE TABLE [dbo].[ServerModuleAndServiceList] ( 
 [Id]                     INT              IDENTITY(1,1)          NOT NULL,
 [InheritedPageType]      VARCHAR(50)                             NOT NULL,
 [Name]                   VARCHAR(50)                             NOT NULL,
 [InheritedLayoutType]    VARCHAR(50)                                 NULL  CONSTRAINT [DF_ServerModuleAndServiceList_InheritedLayoutType] DEFAULT ('MultiLangLayout'),
 [Description]            TEXT                                        NULL,
 [UrlSubPath]             VARCHAR(100)                                NULL,
 [OptionalConfiguration]  VARCHAR(2048)                               NULL,
 [AllowedRoles]           VARCHAR(500)                                NULL,
 [RestrictedAccess]       BIT                                     NOT NULL,
 [RedirectPathOnError]    VARCHAR(100)                                NULL,
 [CustomHtmlContent]      TEXT                                        NULL,
 [IsLoginModule]          BIT                                     NOT NULL  CONSTRAINT [DF_ServerModuleAndServiceList_IsLoginModule] DEFAULT ((0)),
 [PathSetAllowed]         BIT                                     NOT NULL,
 [RestrictionSetAllowed]  BIT                                     NOT NULL,
 [HtmlSetAllowed]         BIT                                     NOT NULL,
 [RedirectSetAllowed]     BIT                                     NOT NULL,
 [Active]                 BIT                                     NOT NULL  CONSTRAINT [DF_ServerModuleAndServiceList_Active] DEFAULT ((1)),
 [UserId]                 INT                                     NOT NULL,
 [TimeStamp]              DATETIME2                               NOT NULL  CONSTRAINT [DF_ServerModuleAndServiceList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_ServerModuleAndServiceList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_ServerModuleAndServiceList]  UNIQUE      NONCLUSTERED ([Name] asc) ,
 CONSTRAINT   [IX_ServerModuleAndServiceList_2]  UNIQUE      NONCLUSTERED ([UrlSubPath] asc) ,
 CONSTRAINT [FK_ServerModuleAndServiceList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 
 GO
 
 CREATE   TRIGGER [dbo].[TR_ServerModuleAndServiceList] ON [dbo].[ServerModuleAndServiceList]
FOR INSERT, UPDATE, DELETE
AS
DECLARE @Operation VARCHAR(15)
 
IF EXISTS (SELECT 0 FROM inserted)
BEGIN
	DECLARE @setIsLoginModule bit;DECLARE @RecId int;DECLARE @UrlSubPath VarChar(100);DECLARE @Type VarChar(50);DECLARE @ModulePathExist bit;
	SET NOCOUNT ON;

    IF EXISTS (SELECT 0 FROM deleted)
    BEGIN --UPDADE
		SET @ModulePathExist = 0;
		SELECT @setIsLoginModule = ins.[IsLoginModule] from inserted ins;
		SELECT @RecId = ins.Id from inserted ins;
		SELECT @UrlSubPath = ins.UrlSubPath from inserted ins;
		SELECT @Type = ins.[InheritedLayoutType] from inserted ins;

		--CheckExisting Only One Allowed HTML Module
		IF (@Type = 'FullHtmlPage' OR @Type = 'HtmlBodyOnly') BEGIN
			SELECT @ModulePathExist = 1 FROM [dbo].[ServerModuleAndServiceList] WHERE UrlSubPath = @UrlSubPath;
			IF (@ModulePathExist = 1) BEGIN
				RAISERROR('Can Be Only One Endpoint for Html Module', 16, 1)  
				ROLLBACK TRANSACTION
				RETURN
			END
		END

		--Changing Login Module Set
		IF(@setIsLoginModule = 1) BEGIN
			UPDATE [dbo].ServerModuleAndServiceList SET [IsLoginModule] = 0 WHERE Id <> @RecId; 
		END
	END ELSE
		BEGIN -- INSERT
			SET @ModulePathExist = 0;
			SELECT @setIsLoginModule = ins.[IsLoginModule] from inserted ins;
			SELECT @RecId = ins.Id from inserted ins;
			SELECT @UrlSubPath = ins.UrlSubPath from inserted ins;
			SELECT @Type = ins.[InheritedLayoutType] from inserted ins;

			--CheckExisting Only One Allowed HTML Module
			IF (@Type = 'FullHtmlPage' OR @Type = 'HtmlBodyOnly') BEGIN
				SELECT @ModulePathExist = 1 FROM [dbo].[ServerModuleAndServiceList] WHERE UrlSubPath = @UrlSubPath;
				IF (@ModulePathExist = 1) BEGIN
					RAISERROR('Can Be Only One Endpoint for Html Module', 16, 1)  
					ROLLBACK TRANSACTION
					RETURN
				END
			END

			--Changing Login Module Set
			IF(@setIsLoginModule = 1) BEGIN
				UPDATE [dbo].ServerModuleAndServiceList SET [IsLoginModule] = 0 WHERE Id <> @RecId; 		
			END
		
		END
END ELSE 
BEGIN --DELETE
	SELECT @setIsLoginModule = ins.[IsLoginModule] from deleted ins;
	SELECT @RecId = ins.Id from deleted ins;

	--Changing Login Module Set
	IF(@setIsLoginModule = 1) BEGIN
		UPDATE [dbo].ServerModuleAndServiceList SET [IsLoginModule] = 1  
		WHERE Id IN(SELECT TOP (1) Id FROM [dbo].ServerModuleAndServiceList WHERE Id <> @RecId)
		;
	END
END

 GO

TBL ServerSettingList

			
 IF OBJECT_ID('[dbo].[ServerSettingList]') IS NOT NULL 
 DROP TABLE [dbo].[ServerSettingList] 
 GO
 CREATE TABLE [dbo].[ServerSettingList] ( 
 [Id]                  INT              IDENTITY(1,1)          NOT NULL,
 [InheritedGroupName]  VARCHAR(50)                             NOT NULL,
 [Type]                VARCHAR(50)                             NOT NULL  CONSTRAINT [DF_ServerSettingList_Type] DEFAULT ('bit'),
 [Key]                 NVARCHAR(150)                           NOT NULL,
 [Value]               NVARCHAR(150)                           NOT NULL,
 [Description]         TEXT                                        NULL,
 [Link]                VARCHAR(1024)                               NULL,
 [UserId]              INT                                     NOT NULL,
 [Active]              BIT                                     NOT NULL  CONSTRAINT [DF_AdminConfiguration_Active] DEFAULT ((1)),
 [Timestamp]           DATETIME2                               NOT NULL  CONSTRAINT [DF_AdminConfiguration_CreateDate] DEFAULT (getdate()),
 CONSTRAINT   [PK_AdminConfiguration]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_ServerSettingList]  UNIQUE      NONCLUSTERED ([Key] asc) ,
 CONSTRAINT [FK_ServerSettingList_SolutionUserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 

TBL ServerStaticOrMvcDefPathList

			
 IF OBJECT_ID('[dbo].[ServerStaticOrMvcDefPathList]') IS NOT NULL 
 DROP TABLE [dbo].[ServerStaticOrMvcDefPathList] 
 GO
 CREATE TABLE [dbo].[ServerStaticOrMvcDefPathList] ( 
 [Id]                    INT              IDENTITY(1,1)          NOT NULL,
 [SystemName]            VARCHAR(50)                             NOT NULL,
 [WebRootSubPath]        VARCHAR(2048)                           NOT NULL,
 [AliasPath]             VARCHAR(255)                                NULL,
 [Description]           TEXT                                        NULL,
 [IsBrowsable]           BIT                                     NOT NULL  CONSTRAINT [DF_ServerStaticOrMvcDefPathList_IsBowsable] DEFAULT ((0)),
 [IsStaticOrMvcDefOnly]  BIT                                     NOT NULL  CONSTRAINT [DF_ServerStaticOrMvcDefPathList_IsStaticOrMvcDefOnly] DEFAULT ((0)),
 [UserId]                INT                                     NOT NULL,
 [Active]                BIT                                     NOT NULL,
 [TimeStamp]             DATETIME2                               NOT NULL  CONSTRAINT [DF_ServerStaticOrMvcDefPathList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_ServerStaticOrMvcDefPathList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_ServerStaticOrMvcDefPathList]  UNIQUE      NONCLUSTERED ([SystemName] asc) ,
 CONSTRAINT [FK_ServerStaticOrMvcDefPathList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 

TBL ServerToolPanelDefinitionList

			
 IF OBJECT_ID('[dbo].[ServerToolPanelDefinitionList]') IS NOT NULL 
 DROP TABLE [dbo].[ServerToolPanelDefinitionList] 
 GO
 CREATE TABLE [dbo].[ServerToolPanelDefinitionList] ( 
 [Id]               INT              IDENTITY(1,1)          NOT NULL,
 [ToolTypeId]       INT                                     NOT NULL,
 [SystemName]       VARCHAR(50)                             NOT NULL,
 [Type]             VARCHAR(50)                             NOT NULL,
 [Command]          VARCHAR(500)                            NOT NULL,
 [IconName]         VARCHAR(50)                             NOT NULL,
 [IconColor]        VARCHAR(50)                             NOT NULL,
 [BackgroundColor]  VARCHAR(50)                             NOT NULL,
 [Description]      TEXT                                        NULL,
 [UserId]           INT                                     NOT NULL,
 [Timestamp]        DATETIME2                               NOT NULL  CONSTRAINT [DF_ServerToolPanelDefinitionList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_ServerToolPanelDefinitionList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_ServerToolPanelDefinitionList]  UNIQUE      NONCLUSTERED ([SystemName] asc) ,
 CONSTRAINT [FK_ServerToolPanelDefinitionList_ToolTypeList] FOREIGN KEY ([ToolTypeId]) REFERENCES [dbo].[ServerToolTypeList] (Id) ,
 CONSTRAINT [FK_ServerToolPanelDefinitionList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 

TBL ServerToolTypeList

			
 IF OBJECT_ID('[dbo].[ServerToolTypeList]') IS NOT NULL 
 DROP TABLE [dbo].[ServerToolTypeList] 
 GO
 CREATE TABLE [dbo].[ServerToolTypeList] ( 
 [Id]           INT              IDENTITY(1,1)          NOT NULL,
 [Sequence]     INT                                     NOT NULL,
 [Name]         VARCHAR(50)                             NOT NULL,
 [Description]  TEXT                                        NULL,
 [UserId]       INT                                     NOT NULL,
 [TimeStamp]    DATETIME2                               NOT NULL  CONSTRAINT [DF_ServerToolTypeList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_ServerToolTypeList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_ServerToolTypeList]  UNIQUE      NONCLUSTERED ([Name] asc) ,
 CONSTRAINT [FK_ServerToolTypeList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 

TBL SolutionEmailerHistoryList

			
 IF OBJECT_ID('[dbo].[SolutionEmailerHistoryList]') IS NOT NULL 
 DROP TABLE [dbo].[SolutionEmailerHistoryList] 
 GO
 CREATE TABLE [dbo].[SolutionEmailerHistoryList] ( 
 [Id]         INT              IDENTITY(1,1)          NOT NULL,
 [Recipient]  VARCHAR(1024)                           NOT NULL,
 [Subject]    VARCHAR(1024)                           NOT NULL,
 [Email]      TEXT                                        NULL,
 [Status]     VARCHAR(2048)                           NOT NULL,
 [TimeStamp]  DATETIME2                               NOT NULL  CONSTRAINT [DF_SolutionEmailerHistoryList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_SolutionEmailerHistoryList]  PRIMARY KEY CLUSTERED    ([Id] asc) )
 
 
 GO
 
 



CREATE   TRIGGER [dbo].[TR_SolutionEmailerHistoryList] ON [dbo].[SolutionEmailerHistoryList]
FOR INSERT
AS
 
IF EXISTS (SELECT 0 FROM inserted)
BEGIN
	SET NOCOUNT ON;

    IF EXISTS (SELECT 0 FROM deleted)
    BEGIN --UPDATE
		SET NOCOUNT ON;
	END ELSE
		BEGIN -- INSERT
			EXEC [dbo].[SpAutoCleanEmailer];
		END
END

 GO

TBL SolutionEmailTemplateList

			
 IF OBJECT_ID('[dbo].[SolutionEmailTemplateList]') IS NOT NULL 
 DROP TABLE [dbo].[SolutionEmailTemplateList] 
 GO
 CREATE TABLE [dbo].[SolutionEmailTemplateList] ( 
 [Id]                INT              IDENTITY(1,1)          NOT NULL,
 [SystemLanguageId]  INT                                     NOT NULL,
 [TemplateName]      VARCHAR(50)                             NOT NULL,
 [Variables]         TEXT                                    NOT NULL,
 [Subject]           VARCHAR(255)                            NOT NULL,
 [Email]             TEXT                                        NULL,
 [UserId]            INT                                     NOT NULL,
 [TimeStamp]         DATETIME2                               NOT NULL  CONSTRAINT [DF_EmailTemplateList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_EmailTemplateList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_EmailTemplateList]  UNIQUE      NONCLUSTERED ([SystemLanguageId] asc, [TemplateName] asc) ,
 CONSTRAINT [FK_EmailTemplateList_SystemLanguageList] FOREIGN KEY ([SystemLanguageId]) REFERENCES [dbo].[SolutionLanguageList] (Id) ,
 CONSTRAINT [FK_EmailTemplateList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 

TBL SolutionFailList

			
 IF OBJECT_ID('[dbo].[SolutionFailList]') IS NOT NULL 
 DROP TABLE [dbo].[SolutionFailList] 
 GO
 CREATE TABLE [dbo].[SolutionFailList] ( 
 [Id]              INT              IDENTITY(1,1)          NOT NULL,
 [Source]          VARCHAR(50)                             NOT NULL,
 [UserName]        VARCHAR(50)                                 NULL,
 [LogLevel]        VARCHAR(20)                                 NULL,
 [Message]         TEXT                                    NOT NULL,
 [ImageName]       VARCHAR(150)                                NULL,
 [Image]           VARBINARY(max)                              NULL,
 [AttachmentName]  VARCHAR(150)                                NULL,
 [Attachment]      VARBINARY(max)                              NULL,
 [UserId]          INT                                         NULL,
 [TimeStamp]       DATETIME2                               NOT NULL  CONSTRAINT [DF_SolutionFailList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_SolutionFailList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT [FK_SolutionFailList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 

TBL SolutionLanguageList

			
 IF OBJECT_ID('[dbo].[SolutionLanguageList]') IS NOT NULL 
 DROP TABLE [dbo].[SolutionLanguageList] 
 GO
 CREATE TABLE [dbo].[SolutionLanguageList] ( 
 [Id]           INT              IDENTITY(1,1)          NOT NULL,
 [SystemName]   VARCHAR(50)                             NOT NULL,
 [Description]  TEXT                                        NULL,
 [UserId]       INT                                     NOT NULL,
 [TimeStamp]    DATETIME2                               NOT NULL  CONSTRAINT [DF_ServerLanguageList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_ServerLanguageList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_ServerLanguageList]  UNIQUE      NONCLUSTERED ([SystemName] asc) ,
 CONSTRAINT [FK_ServerLanguageList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 

TBL SolutionMessageModuleList

			
 IF OBJECT_ID('[dbo].[SolutionMessageModuleList]') IS NOT NULL 
 DROP TABLE [dbo].[SolutionMessageModuleList] 
 GO
 CREATE TABLE [dbo].[SolutionMessageModuleList] ( 
 [Id]               INT              IDENTITY(1,1)          NOT NULL,
 [Level]            INT                                     NOT NULL  CONSTRAINT [DF_SolutionMessageModuleList_Level] DEFAULT ((0)),
 [MessageParentId]  INT                                         NULL,
 [MessageTypeId]    INT                                     NOT NULL,
 [Subject]          VARCHAR(150)                            NOT NULL,
 [HtmlMessage]      TEXT                                    NOT NULL,
 [Shown]            BIT                                     NOT NULL,
 [Archived]         BIT                                     NOT NULL,
 [IsSystemMessage]  BIT                                     NOT NULL,
 [Published]        BIT                                     NOT NULL  CONSTRAINT [DF_SolutionMessageModuleList_Publish] DEFAULT ((0)),
 [FromUserId]       INT                                         NULL,
 [ToUserId]         INT                                         NULL,
 [TimeStamp]        DATETIME2                               NOT NULL  CONSTRAINT [DF_SolutionMessageModuleList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_SolutionMessageModuleList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_SolutionMessageModuleList]  UNIQUE      NONCLUSTERED ([Subject] asc) ,
 CONSTRAINT [FK_SolutionMessageModuleList_SolutionMessageModuleListParent] FOREIGN KEY ([MessageParentId]) REFERENCES [dbo].[SolutionMessageModuleList] (Id) ,
 CONSTRAINT [FK_SolutionMessageModuleList_SolutionMessageTypeList] FOREIGN KEY ([MessageTypeId]) REFERENCES [dbo].[SolutionMessageTypeList] (Id) ,
 CONSTRAINT [FK_SolutionMessageModuleList_SolutionUserListFrom] FOREIGN KEY ([FromUserId]) REFERENCES [dbo].[SolutionUserList] (Id) ,
 CONSTRAINT [FK_SolutionMessageModuleList_SolutionUserListTo] FOREIGN KEY ([ToUserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 

TBL SolutionMessageTypeList

			
 IF OBJECT_ID('[dbo].[SolutionMessageTypeList]') IS NOT NULL 
 DROP TABLE [dbo].[SolutionMessageTypeList] 
 GO
 CREATE TABLE [dbo].[SolutionMessageTypeList] ( 
 [Id]             INT              IDENTITY(1,1)          NOT NULL,
 [Name]           VARCHAR(50)                             NOT NULL,
 [Variables]      TEXT                                        NULL,
 [AnswerAllowed]  BIT                                     NOT NULL  CONSTRAINT [DF_SolutionMessageTypeList_AnswerEnabled] DEFAULT ((0)),
 [IsSystemOnly]   BIT                                     NOT NULL  CONSTRAINT [DF_SolutionMessageTypeList_IsSystemOnly] DEFAULT ((0)),
 [Description]    TEXT                                        NULL,
 [UserId]         INT                                     NOT NULL,
 [TimeStamp]      DATETIME2                               NOT NULL  CONSTRAINT [DF_SolutionMessageTypeList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_SolutionMessageTypeList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_SolutionMessageTypeList]  UNIQUE      NONCLUSTERED ([Name] asc) ,
 CONSTRAINT [FK_SolutionMessageTypeList_SolutionUserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 

TBL SolutionMixedEnumList

			
 IF OBJECT_ID('[dbo].[SolutionMixedEnumList]') IS NOT NULL 
 DROP TABLE [dbo].[SolutionMixedEnumList] 
 GO
 CREATE TABLE [dbo].[SolutionMixedEnumList] ( 
 [Id]           INT              IDENTITY(1,1)          NOT NULL,
 [ItemsGroup]   VARCHAR(50)                             NOT NULL,
 [Name]         VARCHAR(50)                             NOT NULL,
 [Description]  TEXT                                        NULL,
 [UserId]       INT                                     NOT NULL,
 [Active]       BIT                                     NOT NULL  CONSTRAINT [DF_GlobalMixedEnumList_Active] DEFAULT ((1)),
 [TimeStamp]    DATETIME2                               NOT NULL  CONSTRAINT [DF_GlobalMixedEnumList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_GlobalMixedEnumList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_GlobalMixedEnumList]  UNIQUE      NONCLUSTERED ([ItemsGroup] asc, [Name] asc) ,
 CONSTRAINT [FK_GlobalMixedEnumList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) ,
 CONSTRAINT [FK_SolutionMixedEnumList_SolutionMixedEnumList] FOREIGN KEY ([Id]) REFERENCES [dbo].[SolutionMixedEnumList] (Id) )
 
 
 GO
 
 CREATE NONCLUSTERED INDEX [IX_SolutionMixedEnumList] 
    ON [dbo].[SolutionMixedEnumList] ([ItemsGroup] asc)
 CREATE NONCLUSTERED INDEX [IX_SolutionMixedEnumList_1] 
    ON [dbo].[SolutionMixedEnumList] ([Name] asc)

TBL SolutionMottoList

			
 IF OBJECT_ID('[dbo].[SolutionMottoList]') IS NOT NULL 
 DROP TABLE [dbo].[SolutionMottoList] 
 GO
 CREATE TABLE [dbo].[SolutionMottoList] ( 
 [Id]          INT              IDENTITY(1,1)          NOT NULL,
 [SystemName]  VARCHAR(50)                             NOT NULL,
 [UserId]      INT                                     NOT NULL  CONSTRAINT [DF_MottoList_UserId] DEFAULT ((1)),
 [Timestamp]   DATETIME2                               NOT NULL  CONSTRAINT [DF_MottoList_Timestamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_MottoList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_MottoList]  UNIQUE      NONCLUSTERED ([SystemName] asc) ,
 CONSTRAINT [FK_MottoList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 

TBL SolutionOperationList

			
 IF OBJECT_ID('[dbo].[SolutionOperationList]') IS NOT NULL 
 DROP TABLE [dbo].[SolutionOperationList] 
 GO
 CREATE TABLE [dbo].[SolutionOperationList] ( 
 [Id]                       INT              IDENTITY(1,1)          NOT NULL,
 [InheritedTypeName]        VARCHAR(50)                             NOT NULL,
 [Name]                     VARCHAR(255)                            NOT NULL,
 [InputData]                TEXT                                    NOT NULL,
 [InheritedResultTypeName]  VARCHAR(50)                             NOT NULL,
 [Description]              TEXT                                        NULL,
 [UserId]                   INT                                     NOT NULL,
 [Active]                   BIT                                     NOT NULL  CONSTRAINT [DF_SolutionOperationList_Active] DEFAULT ((1)),
 [TimeStamp]                DATETIME2                               NOT NULL  CONSTRAINT [DF_SolutionOperationList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_SolutionOperationList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_SolutionOperationList]  UNIQUE      NONCLUSTERED ([Name] asc) ,
 CONSTRAINT [FK_SolutionOperationList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 

TBL SolutionSchedulerList

			
 IF OBJECT_ID('[dbo].[SolutionSchedulerList]') IS NOT NULL 
 DROP TABLE [dbo].[SolutionSchedulerList] 
 GO
 CREATE TABLE [dbo].[SolutionSchedulerList] ( 
 [Id]                     INT              IDENTITY(1,1)          NOT NULL,
 [InheritedGroupName]     VARCHAR(50)                             NOT NULL,
 [Name]                   VARCHAR(255)                            NOT NULL,
 [Sequence]               INT                                     NOT NULL,
 [Email]                  VARCHAR(255)                                NULL,
 [Data]                   TEXT                                    NOT NULL,
 [Description]            TEXT                                        NULL,
 [StartNowOnly]           BIT                                     NOT NULL,
 [StartAt]                DATETIME2                                   NULL,
 [FinishAt]               DATETIME2                                   NULL,
 [Interval]               INT                                     NOT NULL,
 [InheritedIntervalType]  VARCHAR(50)                             NOT NULL,
 [UserId]                 INT                                     NOT NULL,
 [Active]                 BIT                                     NOT NULL  CONSTRAINT [DF_GlobalAutoSchedulerList_Active] DEFAULT ((1)),
 [TimeStamp]              DATETIME2                               NOT NULL  CONSTRAINT [DF_GlobalAutoSchedulerList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_SolutionSchedulerList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_SolutionSchedulerList]  UNIQUE      NONCLUSTERED ([Name] asc) ,
 CONSTRAINT [FK_GlobalAutoSchedulerList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 

TBL SolutionSchedulerProcessList

			
 IF OBJECT_ID('[dbo].[SolutionSchedulerProcessList]') IS NOT NULL 
 DROP TABLE [dbo].[SolutionSchedulerProcessList] 
 GO
 CREATE TABLE [dbo].[SolutionSchedulerProcessList] ( 
 [Id]                INT              IDENTITY(1,1)          NOT NULL,
 [ScheduledTaskId]   INT                                     NOT NULL,
 [ProcessData]       TEXT                                        NULL,
 [ProcessLog]        TEXT                                        NULL,
 [ProcessCrashed]    BIT                                     NOT NULL,
 [ProcessCompleted]  BIT                                     NOT NULL,
 [TimeStamp]         DATETIME2                               NOT NULL  CONSTRAINT [DF_SolutionSchedulerProcessList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_SolutionSchedulerProcessList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT [FK_SolutionSchedulerProcessList_SolutionSchedulerList] FOREIGN KEY ([ScheduledTaskId]) REFERENCES [dbo].[SolutionSchedulerList] (Id)  ON DELETE CASCADE )
 
 

TBL SolutionStaticFileList

			
 IF OBJECT_ID('[dbo].[SolutionStaticFileList]') IS NOT NULL 
 DROP TABLE [dbo].[SolutionStaticFileList] 
 GO
 CREATE TABLE [dbo].[SolutionStaticFileList] ( 
 [Id]            INT              IDENTITY(1,1)          NOT NULL,
 [WebsiteId]     INT                                     NOT NULL,
 [StaticPathId]  INT                                     NOT NULL,
 [FileNamePath]  VARCHAR(512)                            NOT NULL,
 [MimeType]      VARCHAR(150)                            NOT NULL,
 [Content]       VARBINARY(max)                              NULL,
 [Active]        BIT                                     NOT NULL  CONSTRAINT [DF_SolutionStaticFileList_Active] DEFAULT ((1)),
 [UserId]        INT                                         NULL,
 [TimeStamp]     DATETIME2                               NOT NULL  CONSTRAINT [DF_SolutionStaticFileList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_SolutionStaticFileList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_SolutionStaticFileList]  UNIQUE      NONCLUSTERED ([FileNamePath] asc, [UserId] asc) ,
 CONSTRAINT [FK_SolutionStaticFileList_SolutionStaticFilePathList] FOREIGN KEY ([StaticPathId]) REFERENCES [dbo].[SolutionStaticFilePathList] (Id)  ON DELETE CASCADE ,
 CONSTRAINT [FK_SolutionStaticFileList_SolutionWebsiteList] FOREIGN KEY ([WebsiteId]) REFERENCES [dbo].[SolutionWebsiteList] (Id) ,
 CONSTRAINT [FK_SolutionStaticFileList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 

TBL SolutionStaticFilePathList

			
 IF OBJECT_ID('[dbo].[SolutionStaticFilePathList]') IS NOT NULL 
 DROP TABLE [dbo].[SolutionStaticFilePathList] 
 GO
 CREATE TABLE [dbo].[SolutionStaticFilePathList] ( 
 [Id]         INT              IDENTITY(1,1)          NOT NULL,
 [WebsiteId]  INT                                     NOT NULL,
 [Path]       VARCHAR(512)                            NOT NULL,
 [Size]       INT                                     NOT NULL,
 [Active]     BIT                                     NOT NULL  CONSTRAINT [DF_SolutionStaticFilePathList_Active] DEFAULT ((1)),
 [UserId]     INT                                         NULL,
 [TimeStamp]  DATETIME2                               NOT NULL  CONSTRAINT [DF_SolutionStaticFilePathList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_SolutionStaticFilePathList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_SolutionStaticFilePathList]  UNIQUE      NONCLUSTERED ([Path] asc, [UserId] asc) ,
 CONSTRAINT [FK_SolutionStaticFilePathList_SolutionWebsiteList] FOREIGN KEY ([WebsiteId]) REFERENCES [dbo].[SolutionWebsiteList] (Id)  ON DELETE CASCADE ,
 CONSTRAINT [FK_SolutionStaticFilePathList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 

TBL SolutionTaskList

			
 IF OBJECT_ID('[dbo].[SolutionTaskList]') IS NOT NULL 
 DROP TABLE [dbo].[SolutionTaskList] 
 GO
 CREATE TABLE [dbo].[SolutionTaskList] ( 
 [Id]                   INT              IDENTITY(1,1)          NOT NULL,
 [InheritedTargetType]  VARCHAR(50)                             NOT NULL,
 [InheritedStatusType]  VARCHAR(50)                             NOT NULL,
 [Message]              TEXT                                    NOT NULL,
 [Documentation]        TEXT                                    NOT NULL,
 [ImageName]            VARCHAR(150)                                NULL,
 [Image]                VARBINARY(max)                              NULL,
 [AttachmentName]       VARCHAR(150)                                NULL,
 [Attachment]           VARBINARY(max)                              NULL,
 [UserId]               INT                                     NOT NULL,
 [TimeStamp]            DATETIME2                               NOT NULL  CONSTRAINT [DF_SolutionTaskList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_SolutionTaskList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT [FK_SolutionTaskList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 
 GO
 
 CREATE NONCLUSTERED INDEX [IX_SolutionTaskList] 
    ON [dbo].[SolutionTaskList] ([InheritedTargetType] asc)
 CREATE NONCLUSTERED INDEX [IX_SolutionTaskList_1] 
    ON [dbo].[SolutionTaskList] ([InheritedTargetType] asc, [InheritedStatusType] asc)
 CREATE NONCLUSTERED INDEX [IX_SolutionTaskList_2] 
    ON [dbo].[SolutionTaskList] ([InheritedStatusType] asc)

TBL SolutionUserList

			
 IF OBJECT_ID('[dbo].[SolutionUserList]') IS NOT NULL 
 DROP TABLE [dbo].[SolutionUserList] 
 GO
 CREATE TABLE [dbo].[SolutionUserList] ( 
 [Id]           INT              IDENTITY(1,1)          NOT NULL,
 [RoleId]       INT                                     NOT NULL,
 [UserName]     VARCHAR(150)                            NOT NULL,
 [Password]     VARCHAR(2048)                           NOT NULL,
 [Name]         VARCHAR(150)                            NOT NULL,
 [SurName]      VARCHAR(150)                            NOT NULL,
 [InfoEmail]    VARCHAR(255)                            NOT NULL  CONSTRAINT [DF_SolutionUserList_InfoEmail] DEFAULT ('email@address.com'),
 [Description]  TEXT                                        NULL,
 [Active]       BIT                                     NOT NULL  CONSTRAINT [DF_UserList_active] DEFAULT ((1)),
 [Timestamp]    DATETIME2                               NOT NULL  CONSTRAINT [DF_userList_timestamp] DEFAULT (getdate()),
 [Token]        VARCHAR(2048)                               NULL,
 [Expiration]   DATETIME2                                   NULL,
 [Photo]        VARBINARY(max)                              NULL,
 [MimeType]     VARCHAR(100)                                NULL,
 [PhotoPath]    VARCHAR(500)                                NULL,
 CONSTRAINT   [PK_username]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_UserList]  UNIQUE      NONCLUSTERED ([UserName] asc) ,
 CONSTRAINT [FK_UserList_UserList] FOREIGN KEY ([Id]) REFERENCES [dbo].[SolutionUserList] (Id) ,
 CONSTRAINT [FK_UserList_UserRoleList] FOREIGN KEY ([RoleId]) REFERENCES [dbo].[SolutionUserRoleList] (Id)  ON UPDATE CASCADE  ON DELETE CASCADE )
 
 
 GO
 
 CREATE   TRIGGER [dbo].[TR_UserList] ON dbo.SolutionUserList
FOR INSERT
AS
 
IF EXISTS (SELECT 0 FROM inserted)
BEGIN
	DECLARE @UserId int;

	SET NOCOUNT ON;

    IF EXISTS (SELECT 0 FROM deleted)
    BEGIN --UPDADE

		SELECT @UserId = ins.Id from inserted ins;

	END ELSE
		BEGIN -- INSERT

			SELECT @UserId = ins.Id from inserted ins;
			
			INSERT INTO [dbo].[SystemParameterList]([UserId],[SystemName],[Value],[Type],[Description])
			SELECT @UserId, pa.[SystemName],pa.[Value],pa.[Type],pa.[Description]
			FROM [dbo].[SystemParameterList] pa
			WHERE pa.UserId IS NULL;

		END
END /* ELSE 
BEGIN --DELETE
	SELECT @setActive = ins.[Active] from deleted ins;
	SELECT @RecId = ins.Id from deleted ins;
	SELECT @RecName = ins.[Name] from deleted ins;

	IF(@setActive = 1) BEGIN
		UPDATE [dbo].DocumentationList SET [Active] = 1 
		WHERE Id IN(SELECT TOP (1) MAX(d.Id) FROM [dbo].DocumentationList d WHERE d.Id <> @RecId AND d.[Name] = @RecName)
		;
	END
END
*/

 GO

TBL SolutionUserRoleList

			
 IF OBJECT_ID('[dbo].[SolutionUserRoleList]') IS NOT NULL 
 DROP TABLE [dbo].[SolutionUserRoleList] 
 GO
 CREATE TABLE [dbo].[SolutionUserRoleList] ( 
 [Id]                  INT              IDENTITY(1,1)          NOT NULL,
 [SystemName]          VARCHAR(50)                             NOT NULL,
 [MinimalAccessValue]  INT                                     NOT NULL  CONSTRAINT [DF_SolutionUserRoleList_SequenceAccessNumber] DEFAULT ((0)),
 [Description]         TEXT                                        NULL,
 [UserId]              INT                                         NULL,
 [Timestamp]           DATETIME2                               NOT NULL  CONSTRAINT [DF_UserRoleList_timestamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_UserRoleList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_UserRoleList]  UNIQUE      NONCLUSTERED ([SystemName] asc) )
 
 

TBL SolutionWebsiteList

			
 IF OBJECT_ID('[dbo].[SolutionWebsiteList]') IS NOT NULL 
 DROP TABLE [dbo].[SolutionWebsiteList] 
 GO
 CREATE TABLE [dbo].[SolutionWebsiteList] ( 
 [Id]                       INT              IDENTITY(1,1)          NOT NULL,
 [WebsiteName]              VARCHAR(50)                             NOT NULL,
 [Description]              TEXT                                        NULL,
 [MinimalReadAccessValue]   INT                                     NOT NULL  CONSTRAINT [DF_SolutionWebsiteList_MinimalReadAccessValue] DEFAULT ((0)),
 [MinimalWriteAccessValue]  INT                                     NOT NULL  CONSTRAINT [DF_SolutionWebsiteList_MinimalWriteAccessValue] DEFAULT ((0)),
 [UserId]                   INT                                     NOT NULL,
 [Active]                   BIT                                     NOT NULL  CONSTRAINT [DF_SolutionWebsiteList_Active] DEFAULT ((1)),
 [TimeStamp]                DATETIME2                               NOT NULL  CONSTRAINT [DF_SolutionWebsiteList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_SolutionWebsiteList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_SolutionWebsiteList]  UNIQUE      NONCLUSTERED ([WebsiteName] asc) ,
 CONSTRAINT [FK_SolutionWebsiteList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 

TBL SystemCustomPageList

			
 IF OBJECT_ID('[dbo].[SystemCustomPageList]') IS NOT NULL 
 DROP TABLE [dbo].[SystemCustomPageList] 
 GO
 CREATE TABLE [dbo].[SystemCustomPageList] ( 
 [Id]                INT              IDENTITY(1,1)          NOT NULL,
 [PageName]          VARCHAR(250)                            NOT NULL,
 [Description]       TEXT                                        NULL,
 [IsMultiFormType]   BIT                                     NOT NULL,
 [IsServerUrl]       BIT                                     NOT NULL,
 [StartupUrl]        VARCHAR(512)                                NULL,
 [IsWebServer]       BIT                                     NOT NULL,
 [StartupSubFolder]  VARCHAR(150)                                NULL,
 [StartupCommand]    VARCHAR(500)                                NULL,
 [IsGraphType]       BIT                                     NOT NULL,
 [Active]            BIT                                     NOT NULL,
 [UserId]            INT                                     NOT NULL,
 [TimeStamp]         DATETIME2                               NOT NULL  CONSTRAINT [DF_SystemCustomPageList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_SystemCustomPageList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_SystemCustomPageList]  UNIQUE      NONCLUSTERED ([PageName] asc) ,
 CONSTRAINT [FK_SystemCustomPageList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 

TBL SystemDocumentAdviceList

			
 IF OBJECT_ID('[dbo].[SystemDocumentAdviceList]') IS NOT NULL 
 DROP TABLE [dbo].[SystemDocumentAdviceList] 
 GO
 CREATE TABLE [dbo].[SystemDocumentAdviceList] ( 
 [Id]            INT              IDENTITY(1,1)          NOT NULL,
 [BranchId]      INT                                     NOT NULL,
 [DocumentType]  VARCHAR(50)                             NOT NULL,
 [Prefix]        VARCHAR(10)                             NOT NULL,
 [Number]        VARCHAR(10)                             NOT NULL,
 [StartDate]     DATE                                    NOT NULL,
 [EndDate]       DATE                                    NOT NULL,
 [UserId]        INT                                     NOT NULL,
 [Active]        BIT                                     NOT NULL  CONSTRAINT [DF_DocumentAdvice_Active] DEFAULT ((1)),
 [TimeStamp]     DATETIME2                               NOT NULL  CONSTRAINT [DF_DocumentAdvice_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_DocumentAdvice]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT [FK_DocumentAdvice_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) ,
 CONSTRAINT [FK_DocumentAdviceList_BranchList] FOREIGN KEY ([BranchId]) REFERENCES [dbo].[BusinessBranchList] (Id) ,
 CONSTRAINT [FK_DocumentAdviceList_DocumentTypeList] FOREIGN KEY ([DocumentType]) REFERENCES [dbo].[SystemDocumentTypeList] (SystemName) )
 
 
 GO
 
 CREATE NONCLUSTERED INDEX [IX_DocumentAdviceList] 
    ON [dbo].[SystemDocumentAdviceList] ([BranchId] asc, [DocumentType] asc)

TBL SystemDocumentTypeList

			
 IF OBJECT_ID('[dbo].[SystemDocumentTypeList]') IS NOT NULL 
 DROP TABLE [dbo].[SystemDocumentTypeList] 
 GO
 CREATE TABLE [dbo].[SystemDocumentTypeList] ( 
 [Id]           INT              IDENTITY(1,1)          NOT NULL,
 [SystemName]   VARCHAR(50)                             NOT NULL  CONSTRAINT [DF_DocumentTypeList_SystemName] DEFAULT ('MustProgramming'),
 [Description]  TEXT                                        NULL,
 [UserId]       INT                                     NOT NULL,
 [Timestamp]    DATETIME2                               NOT NULL  CONSTRAINT [DF_DocumentTypeList_Timestamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_DocumentTypeList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_DocumentTypeList]  UNIQUE      NONCLUSTERED ([SystemName] asc) ,
 CONSTRAINT [FK_DocumentTypeList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 

TBL SystemGroupMenuList

			
 IF OBJECT_ID('[dbo].[SystemGroupMenuList]') IS NOT NULL 
 DROP TABLE [dbo].[SystemGroupMenuList] 
 GO
 CREATE TABLE [dbo].[SystemGroupMenuList] ( 
 [Id]           INT              IDENTITY(1,1)          NOT NULL,
 [SystemName]   VARCHAR(50)                             NOT NULL,
 [Description]  TEXT                                        NULL,
 [UserId]       INT                                     NOT NULL,
 [Active]       BIT                                     NOT NULL  CONSTRAINT [DF_SystemGroupMenuList_Active] DEFAULT ((1)),
 [TimeStamp]    DATETIME2                               NOT NULL  CONSTRAINT [DF_SystemGroupMenuList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_SystemGroupMenuList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_SystemGroupMenuList]  UNIQUE      NONCLUSTERED ([SystemName] asc) ,
 CONSTRAINT [FK_SystemGroupMenuList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 

TBL SystemIgnoredExceptionList

			
 IF OBJECT_ID('[dbo].[SystemIgnoredExceptionList]') IS NOT NULL 
 DROP TABLE [dbo].[SystemIgnoredExceptionList] 
 GO
 CREATE TABLE [dbo].[SystemIgnoredExceptionList] ( 
 [Id]           INT              IDENTITY(1,1)          NOT NULL,
 [ErrorNumber]  VARCHAR(50)                             NOT NULL,
 [Description]  TEXT                                        NULL,
 [Active]       BIT                                     NOT NULL  CONSTRAINT [DF_IgnoredExceptionList_Active] DEFAULT ((1)),
 [UserId]       INT                                     NOT NULL,
 [TimeStamp]    DATETIME2                               NOT NULL  CONSTRAINT [DF_IgnoredExceptionList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_IgnoredExceptionList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_IgnoredExceptionList]  UNIQUE      NONCLUSTERED ([ErrorNumber] asc) ,
 CONSTRAINT [FK_IgnoredExceptionList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 

TBL SystemLoginHistoryList

			
 IF OBJECT_ID('[dbo].[SystemLoginHistoryList]') IS NOT NULL 
 DROP TABLE [dbo].[SystemLoginHistoryList] 
 GO
 CREATE TABLE [dbo].[SystemLoginHistoryList] ( 
 [Id]         INT              IDENTITY(1,1)          NOT NULL,
 [IpAddress]  VARCHAR(50)                             NOT NULL,
 [UserId]     INT                                     NOT NULL  CONSTRAINT [DF_LoginHistoryList_UserId] DEFAULT ((0)),
 [UserName]   VARCHAR(150)                            NOT NULL,
 [Timestamp]  DATETIME2                               NOT NULL  CONSTRAINT [DF_LoginHistory_timestamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_LoginHistory]  PRIMARY KEY CLUSTERED    ([Id] asc) )
 
 
 GO
 
 CREATE NONCLUSTERED INDEX [IX_LoginHistoryList] 
    ON [dbo].[SystemLoginHistoryList] ([IpAddress] asc)
 CREATE NONCLUSTERED INDEX [IX_LoginHistoryList_1] 
    ON [dbo].[SystemLoginHistoryList] ([UserId] asc)

TBL SystemMenuList

			
 IF OBJECT_ID('[dbo].[SystemMenuList]') IS NOT NULL 
 DROP TABLE [dbo].[SystemMenuList] 
 GO
 CREATE TABLE [dbo].[SystemMenuList] ( 
 [Id]             INT              IDENTITY(1,1)          NOT NULL,
 [MenuType]       VARCHAR(50)                             NOT NULL,
 [GroupId]        INT                                     NOT NULL,
 [FormPageName]   VARCHAR(250)                            NOT NULL,
 [AccessRole]     VARCHAR(1024)                           NOT NULL,
 [Description]    TEXT                                        NULL,
 [UserId]         INT                                     NOT NULL,
 [NotShowInMenu]  BIT                                     NOT NULL  CONSTRAINT [DF_SystemMenuList_NotShowInMenu] DEFAULT ((0)),
 [Active]         BIT                                     NOT NULL  CONSTRAINT [DF_SystemMenuList_Active] DEFAULT ((1)),
 [TimeStamp]      DATETIME2                               NOT NULL  CONSTRAINT [DF_SystemMenuList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_SystemMenuList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_GlobalMenuList]  UNIQUE      NONCLUSTERED ([FormPageName] asc) ,
 CONSTRAINT [FK_SystemMenuList_SystemGroupMenuList] FOREIGN KEY ([GroupId]) REFERENCES [dbo].[SystemGroupMenuList] (Id) ,
 CONSTRAINT [FK_SystemMenuList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 

TBL SystemModuleList

			
 IF OBJECT_ID('[dbo].[SystemModuleList]') IS NOT NULL 
 DROP TABLE [dbo].[SystemModuleList] 
 GO
 CREATE TABLE [dbo].[SystemModuleList] ( 
 [Id]               INT              IDENTITY(1,1)          NOT NULL,
 [ModuleType]       VARCHAR(50)                             NOT NULL,
 [Name]             VARCHAR(255)                            NOT NULL,
 [FolderPath]       VARCHAR(255)                                NULL,
 [FileName]         VARCHAR(255)                                NULL,
 [StartupCommand]   VARCHAR(255)                                NULL,
 [Description]      TEXT                                        NULL,
 [ForegroundColor]  VARCHAR(50)                             NOT NULL,
 [BackgroundColor]  VARCHAR(50)                             NOT NULL,
 [IconName]         VARCHAR(50)                             NOT NULL,
 [IconColor]        VARCHAR(50)                             NOT NULL,
 [UserId]           INT                                     NOT NULL,
 [TimeStamp]        DATETIME2                               NOT NULL  CONSTRAINT [DF_SystemModuleList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_SystemModuleList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_SystemModuleList]  UNIQUE      NONCLUSTERED ([Name] asc) ,
 CONSTRAINT [FK_SystemModuleList_SystemModuleList] FOREIGN KEY ([Id]) REFERENCES [dbo].[SystemModuleList] (Id) ,
 CONSTRAINT [FK_SystemModuleList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 

TBL SystemParameterList

			
 IF OBJECT_ID('[dbo].[SystemParameterList]') IS NOT NULL 
 DROP TABLE [dbo].[SystemParameterList] 
 GO
 CREATE TABLE [dbo].[SystemParameterList] ( 
 [Id]           INT              IDENTITY(1,1)          NOT NULL,
 [UserId]       INT                                         NULL,
 [SystemName]   VARCHAR(50)                             NOT NULL,
 [Value]        TEXT                                    NOT NULL,
 [Type]         VARCHAR(50)                             NOT NULL,
 [Description]  TEXT                                        NULL,
 [TimeStamp]    DATETIME2                               NOT NULL  CONSTRAINT [DF_ParameterList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_ParameterList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_ParameterList]  UNIQUE      NONCLUSTERED ([SystemName] asc, [UserId] asc) ,
 CONSTRAINT [FK_ParameterList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id)  ON DELETE CASCADE )
 
 
 GO
 
 CREATE   TRIGGER [dbo].[TR_ParameterList] ON dbo.SystemParameterList
FOR INSERT
AS
 
IF EXISTS (SELECT 0 FROM inserted)
BEGIN
	DECLARE @UserId int;DECLARE @RecId int;DECLARE @SystemName varchar(50);	DECLARE @Value varchar(max);	
	DECLARE @Type varchar(20); DECLARE @Description varchar(MAX);

	SET NOCOUNT ON;

    IF EXISTS (SELECT 0 FROM deleted)
    BEGIN --UPDADE
		
		SELECT @UserId = ins.UserId from inserted ins;
		
	END ELSE
		BEGIN -- INSERT

			SELECT @RecId = ins.[Id] from inserted ins;
			SELECT @UserId = ins.[UserId] from inserted ins;
			SELECT @SystemName = ins.[SystemName] from inserted ins;
			SELECT @Type  = ins.[Type] from inserted ins;

			SELECT @Value = CONVERT(varchar(MAX),p.[Value]), @Description = CONVERT(varchar(MAX),p.[Description]) from [dbo].[SystemParameterList] p WHERE p.Id =  @RecId ;
			
			IF (@UserId IS NULL) BEGIN
			
				INSERT INTO [dbo].[SystemParameterList]([UserId],[SystemName],[Value],[Type],[Description])
				SELECT DISTINCT pa.UserId, @SystemName, @Value, @Type, @Description
				FROM [dbo].[SystemParameterList] pa
				WHERE pa.UserId IS NOT NULL;
				
			END
		END
END /* ELSE 
BEGIN --DELETE
	SELECT @UserId = ins.[UserId] from inserted ins;
	SELECT @SystemName = ins.[SystemName] from inserted ins;
	
	IF (@UserId IS NULL) BEGIN
		DELETE FROM [dbo].[SystemParameterList] WHERE [SystemName] = @SystemName;
	END
END*/

 GO

TBL SystemReportList

			
 IF OBJECT_ID('[dbo].[SystemReportList]') IS NOT NULL 
 DROP TABLE [dbo].[SystemReportList] 
 GO
 CREATE TABLE [dbo].[SystemReportList] ( 
 [Id]           INT              IDENTITY(1,1)          NOT NULL,
 [PageName]     VARCHAR(50)                             NOT NULL,
 [SystemName]   VARCHAR(50)                             NOT NULL,
 [JoinedId]     BIT                                     NOT NULL  CONSTRAINT [DF_ReportList_JoinedId] DEFAULT ((0)),
 [Description]  TEXT                                        NULL,
 [ReportPath]   VARCHAR(500)                                NULL,
 [MimeType]     VARCHAR(100)                            NOT NULL,
 [File]         VARBINARY(max)                          NOT NULL,
 [UserId]       INT                                     NOT NULL,
 [Active]       BIT                                     NOT NULL  CONSTRAINT [DF_ReportList_Active] DEFAULT ((1)),
 [Timestamp]    DATETIME2                               NOT NULL  CONSTRAINT [DF_ReportList_TimeStamp] DEFAULT (getdate()),
 [Default]      BIT                                     NOT NULL  CONSTRAINT [DF_ReportList_Default] DEFAULT ((0)),
 CONSTRAINT   [PK_ReportList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT [FK_ReportList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 
 GO
 
 CREATE   TRIGGER [dbo].[TR_ReportList] ON [dbo].[SystemReportList]
FOR INSERT, UPDATE, DELETE
AS
DECLARE @Operation VARCHAR(15)
 
IF EXISTS (SELECT 0 FROM inserted)
BEGIN
	DECLARE @setDefault bit;DECLARE @RecId int;
	SET NOCOUNT ON;

    IF EXISTS (SELECT 0 FROM deleted)
    BEGIN /* UPDADE */
		SELECT @setDefault = ins.[Default] from inserted ins;
		SELECT @RecId = ins.Id from inserted ins;

		IF(@setDefault = 1) BEGIN
			UPDATE [dbo].SystemReportList SET [Default] = 0 WHERE Id <> @RecId; 		
		END
	END ELSE
		BEGIN /* INSERT */
			SELECT @setDefault = ins.[Default] from inserted ins;
			SELECT @RecId = ins.Id from inserted ins;

			IF(@setDefault = 1) BEGIN
				UPDATE [dbo].SystemReportList SET [Default] = 0 WHERE Id <> @RecId; 		
			END
		
		END
END ELSE 
BEGIN /* DELETE */
	SELECT @setDefault = ins.[Default] from deleted ins;
	SELECT @RecId = ins.Id from deleted ins;

	IF(@setDefault = 1) BEGIN
		UPDATE [dbo].SystemReportList SET [Default] = 1  
		WHERE Id IN(SELECT TOP (1) Id FROM [dbo].SystemReportList WHERE Id <> @RecId)
		;
	END
END

 GO

TBL SystemReportQueueList

			
 IF OBJECT_ID('[dbo].[SystemReportQueueList]') IS NOT NULL 
 DROP TABLE [dbo].[SystemReportQueueList] 
 GO
 CREATE TABLE [dbo].[SystemReportQueueList] ( 
 [Id]                  INT              IDENTITY(1,1)          NOT NULL,
 [Name]                VARCHAR(50)                             NOT NULL,
 [Sequence]            INT                                     NOT NULL,
 [Sql]                 NVARCHAR(max)                           NOT NULL,
 [TableName]           VARCHAR(150)                            NOT NULL,
 [Filter]              NVARCHAR(max)                               NULL,
 [Search]              VARCHAR(50)                                 NULL,
 [SearchColumnList]    NVARCHAR(max)                               NULL,
 [SearchFilterIgnore]  BIT                                     NOT NULL  CONSTRAINT [DF_ReportQueue_SearchFilterIgnore] DEFAULT ((0)),
 [RecId]               INT                                         NULL,
 [RecIdFilterIgnore]   BIT                                     NOT NULL  CONSTRAINT [DF_ReportQueue_RecIdFilterIgnore] DEFAULT ((0)),
 [Timestamp]           DATETIME2                               NOT NULL  CONSTRAINT [DF_ReportQueueList_Timestamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_ReportQueue]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_ReportQueueList_1]  UNIQUE      NONCLUSTERED ([TableName] asc, [Sequence] asc) ,
 CONSTRAINT   [IX_ReportQueue]  UNIQUE      NONCLUSTERED ([Name] asc) )
 
 
 GO
 
 CREATE NONCLUSTERED INDEX [IX_ReportQueueList] 
    ON [dbo].[SystemReportQueueList] ([TableName] asc)

TBL SystemSvgIconList

			
 IF OBJECT_ID('[dbo].[SystemSvgIconList]') IS NOT NULL 
 DROP TABLE [dbo].[SystemSvgIconList] 
 GO
 CREATE TABLE [dbo].[SystemSvgIconList] ( 
 [Id]           INT              IDENTITY(1,1)          NOT NULL,
 [Name]         VARCHAR(50)                             NOT NULL,
 [SvgIconPath]  VARCHAR(4096)                           NOT NULL,
 [UserId]       INT                                     NOT NULL,
 [TimeStamp]    DATETIME2                               NOT NULL  CONSTRAINT [DF_SvgIconList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_SvgIconList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_SvgIconList]  UNIQUE      NONCLUSTERED ([Name] asc) ,
 CONSTRAINT [FK_SvgIconList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 

TBL SystemTranslationList

			
 IF OBJECT_ID('[dbo].[SystemTranslationList]') IS NOT NULL 
 DROP TABLE [dbo].[SystemTranslationList] 
 GO
 CREATE TABLE [dbo].[SystemTranslationList] ( 
 [Id]             INT              IDENTITY(1,1)          NOT NULL,
 [SystemName]     VARCHAR(50)                             NOT NULL,
 [DescriptionCz]  VARCHAR(500)                                NULL,
 [DescriptionEn]  VARCHAR(500)                                NULL,
 [UserId]         INT                                         NULL  CONSTRAINT [DF_SystemTranslationList_UserId] DEFAULT ((0)),
 [Timestamp]      DATETIME2                               NOT NULL  CONSTRAINT [DF_SystemTranslationList_Timestamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_SystemTranslationList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_SystemTranslationList]  UNIQUE      NONCLUSTERED ([SystemName] asc) ,
 CONSTRAINT [FK_SystemTranslationList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 
 GO
 
 

CREATE   TRIGGER [dbo].[TR_SystemTranslationList] ON [dbo].[SystemTranslationList]
FOR INSERT
AS
 
IF EXISTS (SELECT 0 FROM inserted)
BEGIN
	DECLARE @UserId int;DECLARE @RecId int;
	DECLARE @AutoFillDictionaries bit;
	DECLARE @SystemName varchar(50);DECLARE @DescriptionCz varchar(500);DECLARE @DescriptionEn varchar(500);
	SET @AutoFillDictionaries = 1;

	SET NOCOUNT ON;
    IF NOT EXISTS (SELECT 0 FROM deleted)
		BEGIN -- INSERT
			
			SELECT @RecId = ins.Id from inserted ins;
			SELECT @UserId = ins.UserId from inserted ins;
			SELECT @SystemName = ins.SystemName from inserted ins;
			SELECT @DescriptionCz = ins.DescriptionCz from inserted ins;
			SELECT @DescriptionEn = ins.DescriptionEn from inserted ins;
			
			--GET AutoFilling Configuration
			SELECT @AutoFillDictionaries = CAST(CAST(SUBSTRING(p.[Value],1,10) as varchar(10)) as bit) FROM [dbo].[SystemParameterList] p WHERE p.[UserId] IS NULL AND p.[SystemName] = 'ServerTranslationAutoFillEnabled';

			IF (@AutoFillDictionaries = 1) BEGIN
				IF(@DescriptionCz IS NULL OR LEN(@DescriptionCz) = 0) BEGIN SET @DescriptionCz = @SystemName; END
				IF(@DescriptionEn IS NULL OR LEN(@DescriptionEn) = 0) BEGIN SET @DescriptionEn = @SystemName; END
				UPDATE dbo.SystemTranslationList SET [DescriptionCz] = @DescriptionCz, [DescriptionEn] = @DescriptionEn WHERE Id = @RecId;
			END
		END
END

 GO

TBL TemplateList

			
 IF OBJECT_ID('[dbo].[TemplateList]') IS NOT NULL 
 DROP TABLE [dbo].[TemplateList] 
 GO
 CREATE TABLE [dbo].[TemplateList] ( 
 [Id]           INT              IDENTITY(1,1)          NOT NULL,
 [GroupId]      INT                                     NOT NULL,
 [Sequence]     INT                                     NOT NULL,
 [Name]         VARCHAR(50)                             NOT NULL,
 [Description]  TEXT                                        NULL,
 [UserId]       INT                                     NOT NULL,
 [Default]      BIT                                     NOT NULL,
 [Active]       BIT                                     NOT NULL  CONSTRAINT [DF_TemplateList_Active] DEFAULT ((1)),
 [TimeStamp]    DATETIME2                               NOT NULL  CONSTRAINT [DF_TemplateList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_TemplateList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_TemplateList]  UNIQUE      NONCLUSTERED ([Name] asc) ,
 CONSTRAINT [FK_TemplateList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) ,
 CONSTRAINT [FK_TemplateList_UserRoleList] FOREIGN KEY ([GroupId]) REFERENCES [dbo].[SolutionUserRoleList] (Id) )
 
 

TBL WebBannedIpAddressList

			
 IF OBJECT_ID('[dbo].[WebBannedIpAddressList]') IS NOT NULL 
 DROP TABLE [dbo].[WebBannedIpAddressList] 
 GO
 CREATE TABLE [dbo].[WebBannedIpAddressList] ( 
 [Id]           INT              IDENTITY(1,1)          NOT NULL,
 [IpAddress]    VARCHAR(50)                             NOT NULL,
 [Description]  TEXT                                        NULL,
 [UserId]       INT                                     NOT NULL,
 [Active]       BIT                                     NOT NULL  CONSTRAINT [DF_WebBannedUserList_Active] DEFAULT ((1)),
 [TimeStamp]    DATETIME2                               NOT NULL  CONSTRAINT [DF_WebBannedUserList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_WebBannedUserList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_WebBannedUserList]  UNIQUE      NONCLUSTERED ([IpAddress] asc) ,
 CONSTRAINT [FK_WebBannedUserList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 

TBL WebCodeLibraryList

			
 IF OBJECT_ID('[dbo].[WebCodeLibraryList]') IS NOT NULL 
 DROP TABLE [dbo].[WebCodeLibraryList] 
 GO
 CREATE TABLE [dbo].[WebCodeLibraryList] ( 
 [Id]                 INT              IDENTITY(1,1)          NOT NULL,
 [InheritedCodeType]  VARCHAR(50)                                 NULL,
 [Name]               VARCHAR(50)                             NOT NULL,
 [Description]        VARCHAR(2096)                               NULL,
 [Content]            VARCHAR(max)                            NOT NULL,
 [IsCompletion]       BIT                                     NOT NULL  CONSTRAINT [DF_WebCodeLibraryList_IsCompletion] DEFAULT ((0)),
 [UserId]             INT                                     NOT NULL,
 [TimeStamp]          DATETIME2                               NOT NULL  CONSTRAINT [DF_WebCodeLibraryList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_WebCodeLibraryList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_WebCodeLibraryList]  UNIQUE      NONCLUSTERED ([Name] asc) ,
 CONSTRAINT [FK_WebCodeLibraryList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 

TBL WebConfiguratorList

			
 IF OBJECT_ID('[dbo].[WebConfiguratorList]') IS NOT NULL 
 DROP TABLE [dbo].[WebConfiguratorList] 
 GO
 CREATE TABLE [dbo].[WebConfiguratorList] ( 
 [Id]               INT              IDENTITY(1,1)          NOT NULL,
 [Name]             VARCHAR(50)                             NOT NULL,
 [IsStartupPage]    BIT                                     NOT NULL,
 [Description]      VARCHAR(max)                                NULL,
 [HtmlContent]      VARCHAR(max)                                NULL,
 [ServerUrl]        VARCHAR(500)                                NULL,
 [AuthRole]         VARCHAR(200)                                NULL,
 [AuthIgnore]       BIT                                     NOT NULL,
 [AuthRedirect]     BIT                                     NOT NULL,
 [AuthRedirectUrl]  VARCHAR(500)                                NULL,
 [IncludedIdList]   VARCHAR(500)                                NULL,
 [Active]           BIT                                     NOT NULL  CONSTRAINT [DF_WebConfiguratorList_Active] DEFAULT ((1)),
 [UserId]           INT                                     NOT NULL,
 [TimeStamp]        DATETIME2                               NOT NULL  CONSTRAINT [DF_WebConfiguratorList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_WebConfiguratorList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_WebConfiguratorList]  UNIQUE      NONCLUSTERED ([Name] asc) ,
 CONSTRAINT   [IX_WebConfiguratorList_1]  UNIQUE      NONCLUSTERED ([ServerUrl] asc) ,
 CONSTRAINT [FK_WebConfiguratorList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 

TBL WebCoreFileList

			
 IF OBJECT_ID('[dbo].[WebCoreFileList]') IS NOT NULL 
 DROP TABLE [dbo].[WebCoreFileList] 
 GO
 CREATE TABLE [dbo].[WebCoreFileList] ( 
 [Id]                 INT              IDENTITY(1,1)          NOT NULL,
 [SpecificationType]  VARCHAR(50)                             NOT NULL,
 [Sequence]           INT                                     NOT NULL,
 [MetroPath]          VARCHAR(100)                            NOT NULL  CONSTRAINT [DF_WebCoreFileList_MetroPath] DEFAULT (''),
 [FileName]           VARCHAR(50)                             NOT NULL,
 [Description]        TEXT                                        NULL,
 [RewriteLowerLevel]  BIT                                     NOT NULL  CONSTRAINT [DF_WebCoreFileList_RewriteLowerLevel] DEFAULT ((0)),
 [GuestFileContent]   TEXT                                        NULL,
 [UserFileContent]    TEXT                                        NULL,
 [AdminFileContent]   TEXT                                        NULL,
 [ProviderContent]    TEXT                                        NULL,
 [IsUniquePath]       BIT                                     NOT NULL  CONSTRAINT [DF_WebCoreFileList_IsUniquePath] DEFAULT ((0)),
 [AutoUpdateOnSave]   BIT                                     NOT NULL,
 [Active]             BIT                                     NOT NULL,
 [UserId]             INT                                     NOT NULL,
 [TimeStamp]          DATETIME2                               NOT NULL  CONSTRAINT [DF_WebCoreFileList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_WebCoreFileList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_WebCoreFileList]  UNIQUE      NONCLUSTERED ([FileName] asc, [SpecificationType] asc) ,
 CONSTRAINT [FK_WebCoreFileList_GlobalUserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 

TBL WebDeveloperNewsList

			
 IF OBJECT_ID('[dbo].[WebDeveloperNewsList]') IS NOT NULL 
 DROP TABLE [dbo].[WebDeveloperNewsList] 
 GO
 CREATE TABLE [dbo].[WebDeveloperNewsList] ( 
 [Id]           INT              IDENTITY(1,1)          NOT NULL,
 [Title]        VARCHAR(50)                             NOT NULL,
 [Description]  TEXT                                        NULL,
 [UserId]       INT                                     NOT NULL,
 [Active]       BIT                                     NOT NULL  CONSTRAINT [DF_WebDeveloperNewsList_Active] DEFAULT ((1)),
 [TimeStamp]    DATETIME2                               NOT NULL  CONSTRAINT [DF_WebDeveloperNewsList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_WebDeveloperNewsList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_WebDeveloperNewsList]  UNIQUE      NONCLUSTERED ([Title] asc) ,
 CONSTRAINT [FK_WebDeveloperNewsList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 

TBL WebDocumentationCodeLibraryList

			
 IF OBJECT_ID('[dbo].[WebDocumentationCodeLibraryList]') IS NOT NULL 
 DROP TABLE [dbo].[WebDocumentationCodeLibraryList] 
 GO
 CREATE TABLE [dbo].[WebDocumentationCodeLibraryList] ( 
 [Id]           INT              IDENTITY(1,1)          NOT NULL,
 [Name]         VARCHAR(50)                             NOT NULL,
 [Description]  VARCHAR(2096)                               NULL,
 [MdContent]    TEXT                                    NOT NULL,
 [HtmlContent]  TEXT                                    NOT NULL,
 [UserId]       INT                                     NOT NULL,
 [TimeStamp]    DATETIME2                               NOT NULL  CONSTRAINT [DF_WebDocumentationCodeLibraryList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_WebDocumentationCodeLibraryList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_WebDocumentationCodeLibraryList]  UNIQUE      NONCLUSTERED ([Name] asc) ,
 CONSTRAINT [FK_WebDocumentationCodeLibraryList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 

TBL WebDocumentationList

			
 IF OBJECT_ID('[dbo].[WebDocumentationList]') IS NOT NULL 
 DROP TABLE [dbo].[WebDocumentationList] 
 GO
 CREATE TABLE [dbo].[WebDocumentationList] ( 
 [Id]           INT              IDENTITY(1,1)          NOT NULL,
 [Name]         VARCHAR(150)                            NOT NULL,
 [Sequence]     INT                                     NOT NULL,
 [Description]  TEXT                                        NULL,
 [MdContent]    TEXT                                    NOT NULL,
 [HtmlContent]  TEXT                                    NOT NULL,
 [UserId]       INT                                     NOT NULL,
 [Active]       BIT                                     NOT NULL  CONSTRAINT [DF_WebDocumentationList_Active] DEFAULT ((1)),
 [AutoVersion]  INT                                     NOT NULL,
 [TimeStamp]    DATETIME2                               NOT NULL  CONSTRAINT [DF_WebDocumentationList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_WebDocumentationList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_WebDocumentationList]  UNIQUE      NONCLUSTERED ([Name] asc, [AutoVersion] asc, [TimeStamp] asc) ,
 CONSTRAINT [FK_WebDocumentationList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 
 GO
 
 
CREATE   TRIGGER [dbo].[TR_WebDocumentationList] ON [dbo].[WebDocumentationList]
FOR INSERT, UPDATE--, DELETE
AS
DECLARE @Operation VARCHAR(15)
 
IF EXISTS (SELECT 0 FROM inserted)
BEGIN
	DECLARE @setActive bit;DECLARE @autoVersion int;DECLARE @RecId int;DECLARE @RecName varchar(150);
	DECLARE @autoRemoveOld bit; DECLARE @UserId int;
	

	SET @autoVersion = 0;SET @setActive = 1;SET @autoRemoveOld = 0;
	SET NOCOUNT ON;

    IF EXISTS (SELECT 0 FROM deleted)
    BEGIN --UPDADE
		SELECT @setActive = ins.[Active] from inserted ins;
		SELECT @RecId = ins.Id from inserted ins;
		SELECT @UserId = ins.UserId from inserted ins;
		SELECT @RecName = ins.[Name] from inserted ins;

		--GET AutoRemoveSetting
		SELECT @autoRemoveOld = CAST(CAST(SUBSTRING(p.[Value],1,10) as varchar(10)) as bit) FROM [dbo].[SystemParameterList] p WHERE p.[UserId] = @UserId AND p.[SystemName] = 'WebDocsOldAutoRemoveEnabled';

		IF(@setActive = 1) BEGIN
			UPDATE [dbo].WebDocumentationList SET [Active] = 0 WHERE Id <> @RecId AND [Name] = @RecName; 		
		END

		--AutoRemove Older versions
		IF(@autoRemoveOld = 1) BEGIN
			DELETE FROM  [dbo].WebDocumentationList WHERE Id <> @RecId AND [Name] = @RecName; 		
		END

	END ELSE
		BEGIN -- INSERT
			SELECT @setActive = ins.[Active] from inserted ins;
			SELECT @RecId = ins.Id from inserted ins;
			SELECT @UserId = ins.UserId from inserted ins;
			SELECT @RecName = ins.[Name] from inserted ins;

			--GET AutoRemoveSetting
			SELECT @autoRemoveOld = CAST(CAST(SUBSTRING(p.[Value],1,10) as varchar(10)) as bit) FROM [dbo].[SystemParameterList] p WHERE p.[UserId] = @UserId AND p.[SystemName] = 'WebDocsOldAutoRemoveEnabled';

			--AutoVersioning
			SELECT @autoVersion = MAX(d.[AutoVersion]) + 1 FROM [dbo].WebDocumentationList d WHERE d.[Name] = @RecName;
			IF (@autoVersion = 0 ) BEGIN SET @autoVersion = 1; END
			UPDATE [dbo].WebDocumentationList SET [AutoVersion] = @autoVersion WHERE Id = @RecId;

			IF(@setActive = 1) BEGIN
				UPDATE [dbo].WebDocumentationList SET [Active] = 0 WHERE Id <> @RecId AND [Name] = @RecName; 		
			END
			
			--AutoRemove Older versions
			IF(@autoRemoveOld = 1) BEGIN
				DELETE FROM  [dbo].WebDocumentationList WHERE Id <> @RecId AND [Name] = @RecName; 		
			END
		END
END /* ELSE 
BEGIN --DELETE
	SELECT @setActive = ins.[Active] from deleted ins;
	SELECT @RecId = ins.Id from deleted ins;
	SELECT @RecName = ins.[Name] from deleted ins;

	IF(@setActive = 1) BEGIN
		UPDATE [dbo].WebDocumentationList SET [Active] = 1 
		WHERE Id IN(SELECT TOP (1) MAX(d.Id) FROM [dbo].WebDocumentationList d WHERE d.Id <> @RecId AND d.[Name] = @RecName)
		;
	END
END
*/

 GO

TBL WebGlobalPageBlockList

			
 IF OBJECT_ID('[dbo].[WebGlobalPageBlockList]') IS NOT NULL 
 DROP TABLE [dbo].[WebGlobalPageBlockList] 
 GO
 CREATE TABLE [dbo].[WebGlobalPageBlockList] ( 
 [Id]                   INT              IDENTITY(1,1)          NOT NULL,
 [PagePartType]         VARCHAR(50)                             NOT NULL,
 [Sequence]             INT                                     NOT NULL,
 [Name]                 VARCHAR(50)                             NOT NULL,
 [Description]          TEXT                                        NULL,
 [RewriteLowerLevel]    BIT                                     NOT NULL,
 [GuestHtmlContent]     TEXT                                        NULL,
 [UserHtmlContent]      TEXT                                        NULL,
 [AdminHtmlContent]     TEXT                                        NULL,
 [ProviderHtmlContent]  TEXT                                        NULL,
 [Active]               BIT                                     NOT NULL,
 [UserId]               INT                                     NOT NULL,
 [TimeStamp]            DATETIME2                               NOT NULL  CONSTRAINT [DF_WebGlobalBodyBlockList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_WebGlobalBodyBlockList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_WebGlobalBodyBlockList]  UNIQUE      NONCLUSTERED ([Name] asc, [PagePartType] asc) ,
 CONSTRAINT [FK_WebGlobalBodyBlockList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 

TBL WebGroupMenuList

			
 IF OBJECT_ID('[dbo].[WebGroupMenuList]') IS NOT NULL 
 DROP TABLE [dbo].[WebGroupMenuList] 
 GO
 CREATE TABLE [dbo].[WebGroupMenuList] ( 
 [Id]         INT              IDENTITY(1,1)          NOT NULL,
 [Sequence]   INT                                     NOT NULL,
 [Onclick]    VARCHAR(255)                                NULL,
 [Name]       VARCHAR(50)                             NOT NULL,
 [UserId]     INT                                     NOT NULL,
 [Active]     BIT                                     NOT NULL,
 [TimeStamp]  DATETIME2                               NOT NULL  CONSTRAINT [DF_WebGroupMenuList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_WebGroupMenuList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_WebGroupMenuList]  UNIQUE      NONCLUSTERED ([Name] asc) ,
 CONSTRAINT [FK_WebGroupMenuList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 

TBL WebMenuList

			
 IF OBJECT_ID('[dbo].[WebMenuList]') IS NOT NULL 
 DROP TABLE [dbo].[WebMenuList] 
 GO
 CREATE TABLE [dbo].[WebMenuList] ( 
 [Id]             INT              IDENTITY(1,1)          NOT NULL,
 [GroupId]        INT                                     NOT NULL,
 [Sequence]       INT                                     NOT NULL,
 [Name]           VARCHAR(50)                             NOT NULL,
 [MenuClass]      VARCHAR(100)                                NULL,
 [Description]    VARCHAR(2096)                               NULL,
 [HtmlContent]    TEXT                                    NOT NULL,
 [UserMenu]       BIT                                     NOT NULL  CONSTRAINT [DF_WebMenuList_UserRestriction] DEFAULT ((0)),
 [AdminMenu]      BIT                                     NOT NULL  CONSTRAINT [DF_WebMenuList_AdminMenu] DEFAULT ((0)),
 [UserIPAddress]  VARCHAR(50)                                 NULL,
 [UserId]         INT                                     NOT NULL,
 [Active]         BIT                                     NOT NULL,
 [Default]        BIT                                     NOT NULL,
 [TimeStamp]      DATETIME2                               NOT NULL  CONSTRAINT [DF_WebMenuList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_WebMenuList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_WebMenuList]  UNIQUE      NONCLUSTERED ([Name] asc, [GroupId] asc) ,
 CONSTRAINT [FK_WebMenuList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) ,
 CONSTRAINT [FK_WebMenuList_WebGroupMenuList] FOREIGN KEY ([GroupId]) REFERENCES [dbo].[WebGroupMenuList] (Id) )
 
 
 GO
 
 

CREATE   TRIGGER [dbo].[TR_WebMenuList] ON [dbo].[WebMenuList]
FOR INSERT, UPDATE, DELETE
AS
DECLARE @Operation VARCHAR(15)
 
IF EXISTS (SELECT 0 FROM inserted)
BEGIN
	DECLARE @setDefault bit;DECLARE @RecId int;
	SET NOCOUNT ON;

    IF EXISTS (SELECT 0 FROM deleted)
    BEGIN --UPDADE
		SELECT @setDefault = ins.[Default] from inserted ins;
		SELECT @RecId = ins.Id from inserted ins;

		IF(@setDefault = 1) BEGIN
			UPDATE [dbo].WebMenuList SET [Default] = 0 WHERE Id <> @RecId; 		
		END
	END ELSE
		BEGIN -- INSERT
			SELECT @setDefault = ins.[Default] from inserted ins;
			SELECT @RecId = ins.Id from inserted ins;

			IF(@setDefault = 1) BEGIN
				UPDATE [dbo].WebMenuList SET [Default] = 0 WHERE Id <> @RecId; 		
			END
		
		END
END/* ELSE 
BEGIN --DELETE
	SELECT @setDefault = ins.[Default] from deleted ins;
	SELECT @RecId = ins.Id from deleted ins;

	IF(@setDefault = 1) BEGIN
		UPDATE [dbo].WebMenuList SET [Default] = 1  
		WHERE Id IN(SELECT TOP (1) Id FROM [dbo].WebMenuList WHERE Id <> @RecId)
		;
	END
END*/

 GO

TBL WebMessagesList

			
 IF OBJECT_ID('[dbo].[WebMessagesList]') IS NOT NULL 
 DROP TABLE [dbo].[WebMessagesList] 
 GO
 CREATE TABLE [dbo].[WebMessagesList] ( 
 [Id]           INT              IDENTITY(1,1)          NOT NULL,
 [Name]         VARCHAR(50)                             NOT NULL,
 [Description]  TEXT                                        NULL,
 [UserId]       INT                                     NOT NULL,
 [Active]       BIT                                     NOT NULL  CONSTRAINT [DF_WebMessagesList_Active] DEFAULT ((1)),
 [TimeStamp]    DATETIME2                               NOT NULL  CONSTRAINT [DF_WebMessagesList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_WebMessagesList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_WebMessagesList]  UNIQUE      NONCLUSTERED ([Name] asc) ,
 CONSTRAINT [FK_WebMessagesList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id) )
 
 

TBL WebSettingList

			
 IF OBJECT_ID('[dbo].[WebSettingList]') IS NOT NULL 
 DROP TABLE [dbo].[WebSettingList] 
 GO
 CREATE TABLE [dbo].[WebSettingList] ( 
 [Id]           INT              IDENTITY(1,1)          NOT NULL,
 [Key]          NVARCHAR(50)                            NOT NULL,
 [Value]        TEXT                                    NOT NULL,
 [Description]  TEXT                                        NULL,
 [UserId]       INT                                     NOT NULL,
 [Timestamp]    DATETIME2                               NOT NULL  CONSTRAINT [DF_WebSettingList_CreateDate] DEFAULT (getdate()),
 CONSTRAINT   [PK_WebSettingList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_WebSettingList]  UNIQUE      NONCLUSTERED ([Key] asc) ,
 CONSTRAINT [FK_WebSettingList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id)  ON DELETE CASCADE )
 
 

TBL WebUserSettingList

			
 IF OBJECT_ID('[dbo].[WebUserSettingList]') IS NOT NULL 
 DROP TABLE [dbo].[WebUserSettingList] 
 GO
 CREATE TABLE [dbo].[WebUserSettingList] ( 
 [Id]         INT              IDENTITY(1,1)          NOT NULL,
 [Key]        NVARCHAR(50)                            NOT NULL,
 [Value]      NVARCHAR(250)                           NOT NULL,
 [UserId]     INT                                     NOT NULL,
 [Timestamp]  DATETIME2                               NOT NULL  CONSTRAINT [DF_WebUserSettingList_CreateDate] DEFAULT (getdate()),
 CONSTRAINT   [PK_WebUserSettingList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_WebUserSettingList]  UNIQUE      NONCLUSTERED ([UserId] asc, [Key] asc) ,
 CONSTRAINT [FK_WebUserSettingList_UserList] FOREIGN KEY ([UserId]) REFERENCES [dbo].[SolutionUserList] (Id)  ON DELETE CASCADE )
 
 

TBL WebVisitIpList

			
 IF OBJECT_ID('[dbo].[WebVisitIpList]') IS NOT NULL 
 DROP TABLE [dbo].[WebVisitIpList] 
 GO
 CREATE TABLE [dbo].[WebVisitIpList] ( 
 [Id]                 INT              IDENTITY(1,1)          NOT NULL,
 [WebHostIp]          VARCHAR(50)                             NOT NULL,
 [Description]        TEXT                                        NULL,
 [WhoIsInformations]  TEXT                                        NULL,
 [TimeStamp]          DATETIME2                               NOT NULL  CONSTRAINT [DF_WebVisitIpList_TimeStamp] DEFAULT (getdate()),
 CONSTRAINT   [PK_WebVisitIpList]  PRIMARY KEY CLUSTERED    ([Id] asc) ,
 CONSTRAINT   [IX_WebVisitIpList]  UNIQUE      NONCLUSTERED ([WebHostIp] asc, [TimeStamp] asc) )
 
 

Úvod Start -DATABASE-RULE

Vše začíná U databáze. Pravidla určující MultiLogiku v 1 Balíčku. Zde najdete Kompletní Strukturu Aktuální Databáze a Seznam Pravidel, které je obecně dobré dodržovat

1 pravidlo: Každé slovo má Hluboký Význam

Vytvořené procedury pro automatizaci, Hromadné Operace, Správu DB

DB - Export Procedur Řešení,

Zde procedury pro automatizaci, Hromadné Operace, Správu DB

SP SpTaskDB_CLONE

			
-- Procedure For Clone Database To NEW DATABASE With Create New User If username+Pw is Inserted
-- IF Usename OR password are null the User Is Cerated With Same name AND password as DATABASE



CREATE procedure [dbo].[DB_CLONE](@SourceDbName varchar(255), @NewDbName varchar(255),@Rewrite bit = false, @userName varchar(255) = NULL, @password varchar(255) = NULL)
AS
BEGIN 
	SET NOCOUNT ON;
	
	-- CREATE C:\Database Folder
	BEGIN TRY EXEC xp_cmdshell 'MD C:\Database'; END TRY
	BEGIN CATCH SELECT ERROR_NUMBER() AS ErrorNumber ,ERROR_MESSAGE() AS ErrorMessage; END CATCH;
	
	--CHECK AND SET USERNAME AND PASSWORD
	IF ( ISNULL(@userName,1) = 1 OR ISNULL(@password,1) = 1) BEGIN
		SET @userName = @NewDbName;
		SET @password = @NewDbName;
	END

	--DELETE DATABASE IF EXIST IN REWRITE MODE
	IF (@Rewrite = 1 AND DB_ID(@NewDbName) IS NOT NULL) BEGIN
		BEGIN TRY EXEC('DROP DATABASE ' + @NewDbName +';') END TRY BEGIN CATCH END CATCH;
	END


	--BACKUP SOURCE DATABASE
	DECLARE @backupfile as varchar(1024) = CONCAT('C:\Database\','_',@SourceDbName,'.bak');
	DECLARE @NewDBfileName as varchar(1024) = CONCAT('C:\Database\',@NewDbName,'.mdf');
	DECLARE @NewDBLogfileName as varchar(1024) = CONCAT('C:\Database\',@NewDbName,'_log','.ldf');
	DECLARE @OldDBLogName as varchar(1024) = CONCAT(@SourceDbName,'_log');
	DECLARE @NewDBLogName as varchar(1024) = CONCAT(@NewDbName,'_log');


	BEGIN TRY DBCC SHRINKFILE (2, 1) END TRY BEGIN CATCH END CATCH;
	BACKUP DATABASE @SourceDbName TO DISK = @backupfile;
	BEGIN TRY DBCC SHRINKFILE (2, 1) END TRY BEGIN CATCH END CATCH;
	BACKUP DATABASE @SourceDbName TO DISK = @backupfile;


	--CREATE NEW DFATABASE
	RESTORE DATABASE @NewDbName FROM DISK = @backupfile 
	WITH MOVE @SourceDbName TO @NewDBfileName,
	MOVE @OldDBLogName TO @NewDBLogfileName, 
	FILE = 2,RECOVERY,  REPLACE,  STATS = 10;
	EXEC('ALTER DATABASE ' + @NewDbName + ' SET MULTI_USER');

	--SET RIGHT LOGICAL FILE NAME
	BEGIN TRY EXEC('USE ' + @NewDbName +'; ALTER DATABASE ' + @NewDbName + ' MODIFY FILE (NAME= ' + @SourceDbName +' , NEWNAME= ' +@NewDbName +') ') END TRY BEGIN CATCH END CATCH;
	BEGIN TRY EXEC('USE ' + @NewDbName +'; ALTER DATABASE ' + @NewDbName + ' MODIFY FILE (NAME= ' + @OldDBLogName +' , NEWNAME= ' +@NewDBLogName +') ') END TRY BEGIN CATCH END CATCH;


	-- REMOVE Username For REINSERTING
	BEGIN TRY EXEC('USE ' + @NewDbName + '; DROP USER IF EXISTS '+ @userName) END TRY BEGIN CATCH END CATCH;

	--CREATE NEW USER IF NOT EXIST
	BEGIN TRY
	EXEC('USE ' + @NewDbName + '; CREATE LOGIN ' + @username + ' WITH PASSWORD = ''' + @password + ''', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF')
	--CREATE LOGIN @userName WITH PASSWORD = @password, DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF;
	END TRY 
	BEGIN CATCH SELECT ERROR_NUMBER() AS ErrorNumber ,ERROR_MESSAGE() AS ErrorMessage; END CATCH;

    --SET RIGHTS FOR USER
	BEGIN TRY EXEC('USE ' + @NewDbName + '; CREATE USER ' + @userName +' FOR LOGIN ' + @userName) END TRY BEGIN CATCH END CATCH;
	BEGIN TRY EXEC('USE ' + @NewDbName + '; ALTER ROLE [db_datareader] ADD MEMBER ' + @userName) END TRY BEGIN CATCH END CATCH;
	BEGIN TRY EXEC('USE ' + @NewDbName + '; ALTER ROLE [db_datawriter] ADD MEMBER ' + @userName) END TRY BEGIN CATCH END CATCH;
	BEGIN TRY EXEC('USE ' + @NewDbName + '; GRANT EXECUTE TO ' + @userName) END TRY BEGIN CATCH END CATCH;

END;


SP SpOperationExportConfigFile

			
CREATE PROCEDURE [dbo].[SpOperationExportConfigFile]--(@Json varchar(MAX) OUTPUT)
AS
BEGIN
   DECLARE @Json VARCHAR (4000);

   SET @Json = (SELECT [Key],[Value] FROM ServerSettingList FOR JSON PATH);

  /*
  SET @Json = '{"DatabaseConnectionString":""';

  SELECT 
	@Json += CASE 	
		WHEN [Type] = 'bit' AND LOWER(ss.[Value]) = 'false' THEN CONCAT(',"', ss.[Key],'":False' )
		WHEN [Type] = 'bit' AND LOWER(ss.[Value]) = 'true' THEN CONCAT(',"', ss.[Key],'":True')
		WHEN [Type] = 'int' THEN CONCAT(',"', ss.[Key],'":', ss.[Value])
		ELSE CONCAT(',"', ss.[Key],'":"', ss.[Value],'"')
		END 
	FROM ServerSettingList AS ss;
	*/
	--SET @Json += '''';

	SELECT [Value] FROM OpenJson(@Json);
	
END


SP SpAutoCleanEmailer

			




CREATE PROCEDURE [dbo].[SpAutoCleanEmailer]
AS

BEGIN
	DECLARE @AutoCleanEmailer int;
	SET NOCOUNT ON;

	--GET AutoCleanEmailer Configuration
	SELECT @AutoCleanEmailer = CAST(CAST(SUBSTRING(p.[Value],1,10) as varchar(10)) as int) FROM [dbo].[SystemParameterList] p WHERE p.[UserId] IS NULL AND p.[SystemName] = 'EmailerAutoCleanDayInterval';

	IF(@AutoCleanEmailer > 0) BEGIN
		DELETE FROM [dbo].[SolutionEmailerHistoryList] WHERE [TimeStamp] < DATEADD(DAY, -@AutoCleanEmailer, CAST(CURRENT_TIMESTAMP AS DATETIME));
	END
END


SP _SpOperationTodoCheckRolesIntegrity

			


-- PROCEDURE CREATE Check Roles Integrity In Access Definitions
-- Can Be Damaged By Remove Role
CREATE procedure [dbo].[_SpOperationTodoCheckRolesIntegrity]
AS
BEGIN 
	DECLARE @Error VarChar(MAX);
	
	--DO PROCESS
	BEGIN TRY  
		
		SELECT 1;

		-- PROCESS COMPLETED
		SELECT 'Process Completed' as 'MessageList';
	END TRY  
	BEGIN CATCH  
		SELECT @Error = CONCAT('ProcessIdentifier',' ,ErrNo:',CAST(ERROR_NUMBER() AS VARCHAR),' ,Message:',ERROR_MESSAGE()); 
		INSERT INTO [dbo].[SolutionFailList] ([Source],[Message]) VALUES('Database', @Error);

		-- PROCESS ERROR
		SELECT @Error as 'MessageList';
	END CATCH


END;


SP SpImportTemplateDocFilesFromFolder

			
CREATE PROCEDURE [dbo].[SpImportTemplateDocFilesFromFolder] (
	 @FolderPath NVARCHAR (2048)
   )
AS
BEGIN
   DECLARE @tsql NVARCHAR (4000);DECLARE @Filename varchar(250);DECLARE @GroupId int;DECLARE @Sequence int;DECLARE @Description varchar(250);

   DECLARE @FilePathList TABLE (RowNum int IDENTITY (1, 1) Primary key NOT NULL,SubDirectory nvarchar(255), Depth smallint, FileFlag bit);
   DECLARE @RowCnt int; SET @RowCnt = 0;
   SET NOCOUNT ON

   SET @GroupId = 9;
   SET @Sequence = 1000;
   SET @Description = 'IMPORTED FILE';

   --CLEAN RECORDS WITH SAME DESCRIPTION
   --DELETE FROM [dbo].[DocSrvDocTemplateList] WHERE CONVERT(varchar(MAX),[Description]) IN ('IMPORTED FILE');

   INSERT INTO @FilePathList (SubDirectory, Depth, FileFlag) EXEC xp_dirtree @FolderPath, 0, 1;

   
   WHILE @RowCnt <= (SELECT COUNT([RowNum]) FROM @FilePathList)
	BEGIN
		SET @RowCnt = @RowCnt + 1;
		SELECT @Filename = SubDirectory FROM @FilePathList WHERE [RowNum] = @RowCnt;
		
		   SET @tsql = 'INSERT INTO DocSrvDocTemplateList ([GroupId],[Sequence],[Name],[Description],[UserId],[Template]) ' +
               ' SELECT 9,1000,' + '''' + @Filename + '''' + ',' + '''' + @Description + '''' + ',1, * ' + 
               'FROM Openrowset( Bulk ' + '''' + CONCAT(@FolderPath,'\',@Filename) + '''' + ', Single_Blob) as img';
		   EXEC (@tsql);
		   --PRINT (@tsql);
	END
	
   /* EXAMPLE FOR IMPORT ONLY ONE FILE
	  SET @tsql = 'INSERT INTO DocSrvDocTemplateList ([GroupId],[Sequence],[Name],[Description],[UserId], [Template]) ' +
               ' SELECT ' + '''' + @GroupId + '''' + ','+ '''' + @Sequence + '''' + ',' + '''' + @Filename + '''' + ',' + '''' + @Description + '''' + ',1, * ' + 
               'FROM Openrowset( Bulk ' + '''' + @TemplateFullPath + '''' + ', Single_Blob) as img'
      EXEC (@tsql)
   */

   SET NOCOUNT OFF
END



SP SpTaskDB_BACKUP

			

CREATE procedure [dbo].[SpTaskDB_BACKUP]
AS
BEGIN 
	DECLARE @dbName as varchar(255) = DB_NAME();
	DECLARE @fileName as varchar(1024) = CONCAT('C:\Database\',@dbName,'_',FORMAT(GETDATE(),'yyyyMMdd_hhmmss'),'.bak');

	BEGIN TRY DROP USER [easyitcenter] END TRY BEGIN CATCH END CATCH;
	--DBCC SHRINKFILE (2, 1);
	BACKUP DATABASE @dbName TO DISK = @fileName;
	--DBCC SHRINKFILE (2, 1); 
	BACKUP DATABASE @dbName TO DISK = @fileName;

	BEGIN TRY CREATE USER [easyitcenter] FOR LOGIN [easyitcenter] END TRY BEGIN CATCH END CATCH;
	BEGIN TRY ALTER ROLE [db_datareader] ADD MEMBER [easyitcenter]; END TRY BEGIN CATCH END CATCH;
	BEGIN TRY ALTER ROLE [db_datawriter] ADD MEMBER [easyitcenter]; END TRY BEGIN CATCH END CATCH;
	BEGIN TRY GRANT EXECUTE TO [easyitcenter]; END TRY BEGIN CATCH END CATCH;
	
	
	--PATH ON LINUX:  '/var/backups/DBbackup/hotels.bak'
	SELECT CONCAT('Database Was Backuped to ','C:\Database\',@dbName,'_',FORMAT(GETDATE(),'yyyyMMdd_hhmmss'),'.bak') as 'MessageList';
END;


SP SpTaskDB_SETRIGHTS

			




CREATE procedure [dbo].[SpTaskDB_SETRIGHTS]
AS
BEGIN 
	BEGIN TRY CREATE USER [easyitcenter] FOR LOGIN [easyitcenter] END TRY BEGIN CATCH END CATCH;
	BEGIN TRY ALTER ROLE [db_datareader] ADD MEMBER [easyitcenter]; END TRY BEGIN CATCH END CATCH;
	BEGIN TRY ALTER ROLE [db_datawriter] ADD MEMBER [easyitcenter]; END TRY BEGIN CATCH END CATCH;
	BEGIN TRY GRANT EXECUTE TO [easyitcenter]; END TRY BEGIN CATCH END CATCH;
END;

SELECT CONCAT('Read/Write/Exec Rights On Database EasyITCenter was set','') as 'MessageList';

SP SpProvider_ExportSqlScript

			


-- Its Procedure From Provider To Customer
-- @TargetLinkedDb  must be In Format: 95.183.52.33 or 95.183.52.33,1433 or SNRJDI\SLAMANAGEMENT

CREATE procedure [dbo].[SpProvider_ExportSqlScript](@TableName varchar(255)
)
AS
BEGIN 
	DECLARE @SqlScript as VARCHAR(MAX) ='';

	DECLARE @TableDefinitionList TABLE (RowNum int IDENTITY (1, 1) Primary key NOT NULL, [Template] text NULL);
	INSERT INTO @TableDefinitionList([Template]) EXEC sp_GetDDL @TableName;
	SELECT @SqlScript = [Template] FROM @TableDefinitionList WHERE RowNum = 1;

	SET @SqlScript = REPLACE(@SqlScript,'','''');
	SET @SqlScript = REPLACE(@SqlScript,' GO','');






END;


	SELECT @SqlScript as 'MessageList';


SP SpOperationFailListClean

			




CREATE procedure [dbo].[SpOperationFailListClean]
AS
BEGIN 
	TRUNCATE TABLE [dbo].[SolutionFailList];
	SELECT 'Solution Fails was Cleaned' as 'MessageList';
END;


SP SystemSpGetSystemPageList

			



CREATE procedure [dbo].[SystemSpGetSystemPageList]
AS
BEGIN 

	--GET ALL TABLES
	SELECT CONCAT(TABLE_NAME, 'Page') as 'TableList'
	FROM INFORMATION_SCHEMA.TABLES
	WHERE table_type = 'BASE TABLE' AND TABLE_NAME NOT LIKE '%SupportList%'

	UNION 

	--GET ALL VIEWS
	SELECT 
	  CONCAT(TABLE_NAME, 'Page') as 'TableList'
	FROM INFORMATION_SCHEMA.VIEWS
	WHERE TABLE_NAME NOT LIKE '%SupportList%'

	UNION 

	--GET ALL Custom Form Page Names

	SELECT [PageName] AS TABLE_NAME
	FROM [dbo].[SystemCustomPageList]
	WHERE Active = 1

END;


SP sp_GetDDL

			
--#################################################################################################
-- Real World DBA Toolkit Version 2019-08-01 Lowell Izaguirre lowell@stormrage.com
--#################################################################################################
-- USAGE: exec sp_GetDDL GMACT
--   or   exec sp_GetDDL 'bob.example'
--   or   exec sp_GetDDL '[schemaname].[tablename]'
--   or   exec sp_GetDDL #temp
--#################################################################################################
-- copyright 2004-2018 by Lowell Izaguirre scripts*at*stormrage.com all rights reserved.
--developer utility function added by Lowell, used in SQL Server Management Studio 
-- http://www.stormrage.com/SQLStuff/sp_GetDDL_Latest.txt
--Purpose: Script Any Table, Temp Table or Object(Procedure Function Synonym View Table Trigger)
--#################################################################################################
-- see the thread here for lots of details: http://www.sqlservercentral.com/Forums/Topic751783-566-7.aspx
-- You can use this however you like...this script is not rocket science, but it took a bit of work to create.
-- the only thing that I ask
-- is that if you adapt my procedure or make it better, to simply send me a copy of it,
-- so I can learn from the things you've enhanced.The feedback you give will be what makes
-- it worthwhile to me, and will be fed back to the SQL community.
-- add this to your toolbox of helpful scripts.
--#################################################################################################
--
-- V300  uses String concatination and sys.tables instead of a cursor
-- V301  enhanced 07/31/2009 to include extended properties definitions
-- V302  fixes an issue where the schema is created , ie 'bob', but no user named 'bob' owns the schema, so the table is not found
-- V303  fixes an issue where all rules are appearing, instead of jsut the rule related to a column
-- V304  testing whether vbCrLf is better than just CHAR(13), some formatting cleanup with GO statements
--       also fixed an issue with the conversion from syscolumns to sys.columns, max-length is only field we need, not [precision]
-- V305  user feedback helped me find that the type_name function should call user_type_id instead of system_type_id
--       also fixed issue where identity definition missing from numeric/decimal definition
-- V306  fixes the computed columns definition that got broken/removed somehow in V300
--       also formatting when decimal is not an identity
-- V307  fixes bug identified by David Griffiths-491597 from SSC where the  @TABLE_ID
--       is reselected, but without it's schema  , potentially selecting the wrong table
--       also fixed is the missing size definition for varbinary, also found by David Griffith
-- V308  abtracted all SQLs to use Table Alaises
--       added logic to script a temp table.
--       added warning about possibly not being marked as system object.
-- V309  added logic based on feedback from Vincent Wylenzek @SSC to return the definition from sys.sql_modules for
--       any object like procedure/view/function/trigger, and not just a table. 
--       note previously, if you pointed sp_GetDDL at a view, it returned the view definition as a table...
--       now it will return the view definition instead.
-- V309a returns multi row recordset, one line per record 
-- V310a fixed the commented out code related to collation identified by moadh.bs @SSC
--       changed the DEFAULT definitions to not include the default name.
-- V310b Added PERSISTED to calculated columns where applicable
-- V310b fixed COLLATE statement for temp tables
-- V310c fixed NVARCHAR size misreported as doubled.
-- V311  fixed issue where indexes did not identify if the column was ASC or DESC found by nikus @ SSC
-- V311a fixed issue where indexes did not identify if the index was CLUSTERED or NONCLUSTERED found by nikus @ SSC 02/22/2013
-- V312  got rid of all upper casing, and allowing all scripts to generate the exact object names in cases of case sensitive databases.
--       now using the case sensitive name of the table passed: so of you did 'exec sp_GetDDL invoicedocs , it might return the script for InvoiceDocs, as that is how it is spelled in sys.objects.
--       added if exists(drop table/procedure/function) statement to the scripting automatically.
--       toggled the commented out code to list any default constraints by name, hopefully to be more accurate..
--       formatting of index statements to be multi line for better readability
--V314   03/30/2015
--       did i mention this scripts out temp tables too? sp_GetDDL #tmp
--       scripts any object:table,#temptable procedure, function, view or trigger
--       added ability to script synonyms
--       moved logic for REAL datatype to fix error when scripting real columns
--       added OmaCoders suggestion to script column extended properties as well.
--       added matt_slack suggestion to script schemaname as part of index portion of script.
--       minor script cleanup to use QUOTENAME insead of concatenating square brackets.
--       changed compatibility to 2008 and above only, now filtered idnexes with WHERE statmeents script correctly
--       foreign key tables and columns  in script now quotenamed to account for spaces in names; previously an error for Applciation ID instead of [Application ID]
--V315   Fixes Aliases and column names that prevented Case Sensitive collations from working.
--       Adds code if the procedure scripted is a system object
--       index scripts featuring filtered indexes is now included
--       index scripts now include filegroup name and compression settings
--       foreign key casecade delete/update settings now included as identified by Alberto aserio@SSC)
--       Fixes related to scripting extended events  as identified by Alberto aserio@SSC)
--V316   Fixes Identified 07/27/2016 by mlm( m.martinelli@SSC)
--       Added logic  resolving error when custom data type are defined using name greather than 16 char.
--       Added handling for data types: binary, datetime2, datetimeoffset, time
--       Added Set Based logic for Handling Fixed FOREIGN KEYS handling when one foreign key is define on more then one field
--       Added SPARSE column property
--V317   Fixes Identified 03/30/2017 by Lowell
--       Scripting of Foreign key column(s) are now quotenamed
--       Scripting column store indexes was broken, now fixed for column store indexes
--V318   Fixes Identified 02/14/2018 by Lowell
--       Scripting of with collation added/required for scripting SharePoint/ReportServer , or databases with non standard collations
--       Scripting enhanced to definitively handle case sensitive collations as well.
--V319   Adding logic for Temporal Tables, to grab their auto nistory tables
--       first attempt for partitioned tables, to get the columns correctly on the partition scheme
-- DROP PROCEDURE [dbo].[sp_GetDDL]
--#############################################################################
--if you are going to put this in MASTER, and want it to be able to query
--each database's sys.indexes, you MUST mark it as a system procedure:
--EXECUTE sp_ms_marksystemobject 'sp_GetDDL'
--#############################################################################
CREATE PROCEDURE [dbo].[sp_GetDDL]
  @TBL                VARCHAR(255)
AS
BEGIN
  SET NOCOUNT ON;
  DECLARE     @TBLNAME                VARCHAR(200),
              @SCHEMANAME             VARCHAR(255),
              @STRINGLEN              INT,
              @TABLE_ID               INT,
              @FINALSQL               VARCHAR(MAX),
              @CONSTRAINTSQLS         VARCHAR(MAX),
              @CHECKCONSTSQLS         VARCHAR(MAX),
              @RULESCONSTSQLS         VARCHAR(MAX),
              @FKSQLS                 VARCHAR(MAX),
              @TRIGGERSTATEMENT       VARCHAR(MAX),
              @EXTENDEDPROPERTIES     VARCHAR(MAX),
              @INDEXSQLS              VARCHAR(MAX),
              @MARKSYSTEMOBJECT       VARCHAR(MAX),
              @vbCrLf                 CHAR(2),
              @ISSYSTEMOBJECT         INT,
              @PROCNAME               VARCHAR(256),
              @input                  VARCHAR(MAX),
              @ObjectTypeFound        VARCHAR(255),
              @ObjectDataTypeLen      INT,
              --V3.20 additions
              @WithStatement          VARCHAR(MAX),
              @FileGroupStatement     VARCHAR(MAX),
              @PartitioningStatement  VARCHAR(MAX),
              @TemporalStatement      VARCHAR(MAX);
--##############################################################################
-- INITIALIZE
--##############################################################################
  SET @input = '';
  --new code: determine whether this proc is marked as a system proc with sp_ms_marksystemobject,
  --which flips the is_ms_shipped bit in sys.objects
    SELECT @ISSYSTEMOBJECT = ISNULL([is_ms_shipped],0),@PROCNAME = ISNULL([name],'sp_GetDDL') FROM [sys].[objects] WHERE [object_id] = @@PROCID;
  IF @ISSYSTEMOBJECT IS NULL 
    SELECT @ISSYSTEMOBJECT = ISNULL([is_ms_shipped],0),@PROCNAME = ISNULL([name],'sp_GetDDL') FROM [master].[sys].[objects] WHERE [object_id] = @@PROCID;
  IF @ISSYSTEMOBJECT IS NULL 
    SET @ISSYSTEMOBJECT = 0;  
  IF @PROCNAME IS NULL
    SET @PROCNAME = 'sp_GetDDL';
  --SET @TBL =  '[DBO].[WHATEVER1]'
  --does the tablename contain a schema?
  SET @vbCrLf =  CHAR(10);
  SELECT @SCHEMANAME = ISNULL(PARSENAME(@TBL,2),'dbo') ,
         @TBLNAME    = PARSENAME(@TBL,1);
  SELECT
    @TBLNAME    = [objz].[name],
    @TABLE_ID   = [objz].[object_id]
  FROM [sys].[objects] AS [objz]
  WHERE [objz].[type]          IN ('S','U')
    AND [objz].[name]          <>  'dtproperties'
    AND [objz].[name]           =  @TBLNAME
    AND [objz].[schema_id] =  SCHEMA_ID(@SCHEMANAME) ;
 SELECT @ObjectDataTypeLen = MAX(LEN([name])) FROM [sys].[types];
--##############################################################################
-- Check If TEMP TableName is Valid
--##############################################################################
  IF LEFT(@TBLNAME,1) = '#'  COLLATE SQL_Latin1_General_CP1_CI_AS
    BEGIN
      PRINT '--TEMP TABLE  ' + QUOTENAME(@TBLNAME) + '  FOUND';
      IF OBJECT_ID('tempdb..' + QUOTENAME(@TBLNAME)) IS NOT NULL
        BEGIN
          PRINT '--GOIN TO TEMP PROCESSING';
          GOTO TEMPPROCESS;
        END;
    END;
  ELSE
    BEGIN
      PRINT '--Non-Temp Table, ' + QUOTENAME(@TBLNAME) + ' continue Processing';
    END;
--##############################################################################
-- Check If TableName is Valid
--##############################################################################
  IF ISNULL(@TABLE_ID,0) = 0
    BEGIN
      --V309 code: see if it is an object and not a table.
      SELECT
        @TBLNAME    = [objz].[name],
        @TABLE_ID   = [objz].[object_id],
        @ObjectTypeFound = [objz].[type_desc]
      FROM [sys].[objects] AS [objz]
      --WHERE [type_desc]     IN('SQL_STORED_PROCEDURE','VIEW','SQL_TRIGGER','AGGREGATE_FUNCTION','SQL_INLINE_TABLE_VALUED_FUNCTION','SQL_TABLE_VALUED_FUNCTION','SQL_SCALAR_FUNCTION','SYNONYMN')
      WHERE [objz].[type]          IN ('P','V','TR','AF','IF','FN','TF','SN')
        AND [objz].[name]          <>  'dtproperties'
        AND [objz].[name]           =  @TBLNAME
        AND [objz].[schema_id] =  SCHEMA_ID(@SCHEMANAME) ;
      IF ISNULL(@TABLE_ID,0) <> 0  
        BEGIN
          --adding a drop statement.
          --adding a sp_ms_marksystemobject if needed
          SELECT @MARKSYSTEMOBJECT = CASE 
                                       WHEN [objz].[is_ms_shipped] = 1 
                                       THEN '
GO
--#################################################################################################
--Mark as a system object
EXECUTE sp_ms_marksystemobject  ''' + QUOTENAME(@SCHEMANAME) +'.' + QUOTENAME(@TBLNAME) + '''
--#################################################################################################
' 
                                       ELSE '
GO
' 
                                     END 
          FROM [sys].[objects] AS [objz] 
          WHERE [objz].[object_id] = @TABLE_ID;
          --adding a drop statement.
          IF @ObjectTypeFound = 'SYNONYM'  COLLATE SQL_Latin1_General_CP1_CI_AS
            BEGIN
               SELECT @FINALSQL = 
                'IF EXISTS(SELECT * FROM sys.synonyms WHERE name = ''' 
                                + [name] 
                                + ''''
                                + ' AND base_object_name <> ''' + [base_object_name] + ''')'
                                + @vbCrLf
                                + '  DROP SYNONYM ' + QUOTENAME([name]) + ''
                                + @vbCrLf
                                +'GO'
                                + @vbCrLf
                                +'IF NOT EXISTS(SELECT * FROM sys.synonyms WHERE name = ''' 
                                + [name] 
                                + ''')'
                                + @vbCrLf
                                + 'CREATE SYNONYM ' + QUOTENAME([name]) + ' FOR ' + [base_object_name] +';'
                                FROM [sys].[synonyms]
                                WHERE  [name]   =  @TBLNAME
                                AND [schema_id] =  SCHEMA_ID(@SCHEMANAME);
            END;
          ELSE
            BEGIN
          SELECT @FINALSQL = 
          'IF OBJECT_ID(''' + QUOTENAME(@SCHEMANAME) + '.' + QUOTENAME(@TBLNAME) + ''') IS NOT NULL ' + @vbCrLf
          + 'DROP ' + CASE 
                        WHEN [objz].[type] IN ('P')
                        THEN ' PROCEDURE '
                        WHEN [objz].[type] IN ('V')
                        THEN ' VIEW      '
                        WHEN [objz].[type] IN ('TR')
                        THEN ' TRIGGER   '
                        ELSE ' FUNCTION  '
                      END 
                      + QUOTENAME(@SCHEMANAME) + '.' + QUOTENAME(@TBLNAME) + ' ' + @vbCrLf + 'GO' + @vbCrLf
          + [def].[definition] + @MARKSYSTEMOBJECT
          FROM [sys].[objects] AS [objz] 
            INNER JOIN [sys].[sql_modules] AS [def]
              ON [objz].[object_id] = [def].[object_id]
          WHERE [objz].[type]          IN ('P','V','TR','AF','IF','FN','TF')
            AND [objz].[name]          <>  'dtproperties'
            AND [objz].[name]           =  @TBLNAME
            AND [objz].[schema_id] =  SCHEMA_ID(@SCHEMANAME) ;
            END;
          SET @input = @FINALSQL;  
          
        SELECT @input AS [Item];
         RETURN;
        END;
      ELSE
        BEGIN
        SET @FINALSQL = 'Object ' + QUOTENAME(@SCHEMANAME) + '.' + QUOTENAME(@TBLNAME) + ' does not exist in Database ' + QUOTENAME(DB_NAME())   + ' '  
                      + CASE 
                          WHEN @ISSYSTEMOBJECT = 0 THEN @vbCrLf + ' (also note that ' + @PROCNAME + ' is not marked as a system proc and cross db access to sys.tables will fail.)'
                          ELSE ''
                        END;
      IF LEFT(@TBLNAME,1) = '#' 
        SET @FINALSQL = @FINALSQL + ' OR in The tempdb database.';
      SELECT @FINALSQL AS [Item];
      RETURN 0;
        END;  
      
    END;
--##############################################################################
-- Valid Table, Continue Processing
--##############################################################################
--Is this a SYSTEM versioned TABLE?
SELECT @FINALSQL = 
     CASE 
       WHEN [tabz].[history_table_id] IS NULL 
       THEN '' 
       ELSE 'ALTER TABLE ' + QUOTENAME(OBJECT_SCHEMA_NAME([tabz].[object_id]) ) + '.' + QUOTENAME(OBJECT_NAME([tabz].[object_id])) + ' SET (SYSTEM_VERSIONING = OFF);' + @vbCrLf
            +  'IF OBJECT_ID(''' + QUOTENAME(OBJECT_SCHEMA_NAME([tabz].[history_table_id]) ) + '.' + QUOTENAME(OBJECT_NAME([tabz].[history_table_id])) + ''') IS NOT NULL ' + @vbCrLf
              + 'DROP TABLE ' + QUOTENAME(OBJECT_SCHEMA_NAME([tabz].[history_table_id])) + '.' + QUOTENAME(OBJECT_NAME([tabz].[history_table_id])) + ' ' + @vbCrLf + 'GO' + @vbCrLf
       END
    + 'IF OBJECT_ID(''' + QUOTENAME(OBJECT_SCHEMA_NAME([tabz].[object_id]) ) + '.' + QUOTENAME(OBJECT_NAME([tabz].[object_id])) + ''') IS NOT NULL ' + @vbCrLf
              + 'DROP TABLE ' + QUOTENAME(OBJECT_SCHEMA_NAME([tabz].[object_id])) + '.' + QUOTENAME(OBJECT_NAME([tabz].[object_id])) + ' ' + @vbCrLf + 'GO' + @vbCrLf
              + 'CREATE TABLE ' + QUOTENAME(OBJECT_SCHEMA_NAME([tabz].[object_id])) + '.' + QUOTENAME(OBJECT_NAME([tabz].[object_id])) + ' ( '
    FROM [sys].[tables] [tabz] WHERE [tabz].[object_id] = @TABLE_ID
    PRINT @FINALSQL
  --removed invalid code here which potentially selected wrong table--thanks David Grifiths @SSC!
  SELECT
    @STRINGLEN = MAX(LEN([colz].[name])) + 1
  FROM [sys].[objects] AS [objz]
    INNER JOIN [sys].[columns] AS [colz]
      ON  [objz].[object_id] = [colz].[object_id]
      AND [objz].[object_id] = @TABLE_ID;
--##############################################################################
--Get the columns, their definitions and defaults.
--##############################################################################
  SELECT
    @FINALSQL = @FINALSQL
    + CASE
        WHEN [colz].[is_computed] = 1
        THEN @vbCrLf
             + QUOTENAME([colz].[name])
             + ' '
             + SPACE(@STRINGLEN - LEN([colz].[name]))
             + 'AS ' + ISNULL([CALC].[definition],'')
             + CASE 
                 WHEN [CALC].[is_persisted] = 1 
                 THEN ' PERSISTED'
                 ELSE ''
               END
        ELSE @vbCrLf
             + QUOTENAME([colz].[name])
             + ' '
             + SPACE(@STRINGLEN - LEN([colz].[name]))
             + UPPER(TYPE_NAME([colz].[user_type_id]))
             + CASE
-- data types with precision and scale  IE DECIMAL(18,3), NUMERIC(10,2)
               WHEN TYPE_NAME([colz].[user_type_id]) IN ('decimal','numeric')
               THEN '('
                    + CONVERT(VARCHAR,[colz].[precision])
                    + ','
                    + CONVERT(VARCHAR,[colz].[scale])
                    + ') '
                    + SPACE(6 - LEN(CONVERT(VARCHAR,[colz].[precision])
                    + ','
                    + CONVERT(VARCHAR,[colz].[scale])))
                    + SPACE(7)
                    + SPACE(@ObjectDataTypeLen - LEN(TYPE_NAME([colz].[user_type_id])))
                    + CASE
                        WHEN COLUMNPROPERTY ( @TABLE_ID , [colz].[name] , 'IsIdentity' ) = 0
                        THEN ''
                        ELSE ' IDENTITY('
                               + CONVERT(VARCHAR,ISNULL(IDENT_SEED(@TBLNAME),1) )
                               + ','
                               + CONVERT(VARCHAR,ISNULL(IDENT_INCR(@TBLNAME),1) )
                               + ')'
                        END
                    + CASE  WHEN [colz].[is_sparse] = 1 THEN ' sparse' ELSE '       ' END
                    + CASE
                        WHEN [colz].[is_nullable] = 0
                        THEN ' NOT NULL'
                        ELSE '     NULL'
                      END
-- data types with scale  IE datetime2(7),TIME(7)
               WHEN TYPE_NAME([colz].[user_type_id]) IN ('datetime2','datetimeoffset','time')
               THEN CASE 
                      WHEN [colz].[scale] < 7 THEN
                      '('
                      + CONVERT(VARCHAR,[colz].[scale])
                      + ') '
                    ELSE 
                      '    '
                    END
                    + SPACE(4)
                    + SPACE(@ObjectDataTypeLen - LEN(TYPE_NAME([colz].[user_type_id])))
                    + '        '
                    + CASE  WHEN [colz].[is_sparse] = 1 THEN ' sparse' ELSE '       ' END
                    + CASE [colz].[generated_always_type]
                        WHEN 0 THEN ''
                        WHEN 1 THEN ' GENERATED ALWAYS AS ROW START'
                        WHEN 2 THEN ' GENERATED ALWAYS AS ROW END'
                        ELSE ''
                      END 
                    + CASE WHEN [colz].[is_hidden] = 1 THEN ' HIDDEN' ELSE '' END
                    + CASE
                        WHEN [colz].[is_nullable] = 0
                        THEN ' NOT NULL'
                        ELSE '     NULL'
                      END
--data types with no/precision/scale,IE  FLOAT
               WHEN  TYPE_NAME([colz].[user_type_id]) IN ('float') --,'real')
               THEN
               --addition: if 53, no need to specifically say (53), otherwise display it
                    CASE
                      WHEN [colz].[precision] = 53
                      THEN SPACE(11 - LEN(CONVERT(VARCHAR,[colz].[precision])))
                           + SPACE(7)
                           + SPACE(@ObjectDataTypeLen - LEN(TYPE_NAME([colz].[user_type_id])))
                           + CASE  WHEN [colz].[is_sparse] = 1 THEN ' sparse' ELSE '       ' END
                           + CASE
                               WHEN [colz].[is_nullable] = 0
                               THEN ' NOT NULL'
                               ELSE '     NULL'
                             END
                      ELSE '('
                           + CONVERT(VARCHAR,[colz].[precision])
                           + ') '
                           + SPACE(6 - LEN(CONVERT(VARCHAR,[colz].[precision])))
                           + SPACE(7) + SPACE(@ObjectDataTypeLen - LEN(TYPE_NAME([colz].[user_type_id])))
                           + CASE  WHEN [colz].[is_sparse] = 1 THEN ' sparse' ELSE '       ' END
                           + CASE
                               WHEN [colz].[is_nullable] = 0
                               THEN ' NOT NULL'
                               ELSE '     NULL'
                             END
                      END
--data type with max_length		ie CHAR (44), VARCHAR(40), BINARY(5000),
--##############################################################################
-- COLLATE STATEMENTS
-- personally i do not like collation statements,
-- but included here to make it easy on those who do
--##############################################################################
               WHEN  TYPE_NAME([colz].[user_type_id]) IN ('char','varchar','binary','varbinary')
               THEN CASE
                      WHEN  [colz].[max_length] = -1
                      THEN  '(max)'
                            + SPACE(6 - LEN(CONVERT(VARCHAR,[colz].[max_length])))
                            + SPACE(7) + SPACE(@ObjectDataTypeLen - LEN(TYPE_NAME([colz].[user_type_id])))
                            ----collate to comment out when not desired
                            --+ CASE
                            --    WHEN COLS.collation_name IS NULL
                            --    THEN ''
                            --    ELSE ' COLLATE ' + COLS.collation_name
                            --  END
                            + CASE  WHEN [colz].[is_sparse] = 1 THEN ' sparse' ELSE '       ' END
                            + CASE
                                WHEN [colz].[is_nullable] = 0
                                THEN ' NOT NULL'
                                ELSE '     NULL'
                              END
                      ELSE '('
                           + CONVERT(VARCHAR,[colz].[max_length])
                           + ') '
                           + SPACE(6 - LEN(CONVERT(VARCHAR,[colz].[max_length])))
                           + SPACE(7) + SPACE(@ObjectDataTypeLen - LEN(TYPE_NAME([colz].[user_type_id])))
                           ----collate to comment out when not desired
                           --+ CASE
                           --     WHEN COLS.collation_name IS NULL
                           --     THEN ''
                           --     ELSE ' COLLATE ' + COLS.collation_name
                           --   END
                           + CASE  WHEN [colz].[is_sparse] = 1 THEN ' sparse' ELSE '       ' END
                           + CASE
                               WHEN [colz].[is_nullable] = 0
                               THEN ' NOT NULL'
                               ELSE '     NULL'
                             END
                    END
--data type with max_length ( BUT DOUBLED) ie NCHAR(33), NVARCHAR(40)
               WHEN TYPE_NAME([colz].[user_type_id]) IN ('nchar','nvarchar')
               THEN CASE
                      WHEN  [colz].[max_length] = -1
                      THEN '(max)'
                           + SPACE(5 - LEN(CONVERT(VARCHAR,([colz].[max_length] / 2))))
                           + SPACE(7)
                           + SPACE(@ObjectDataTypeLen - LEN(TYPE_NAME([colz].[user_type_id])))
                           ----collate to comment out when not desired
                           --+ CASE
                           --     WHEN COLS.collation_name IS NULL
                           --     THEN ''
                           --     ELSE ' COLLATE ' + COLS.collation_name
                           --   END
                           + CASE  WHEN [colz].[is_sparse] = 1 THEN ' sparse' ELSE '       ' END
                           + CASE
                               WHEN [colz].[is_nullable] = 0
                               THEN  ' NOT NULL'
                               ELSE '     NULL'
                             END
                      ELSE '('
                           + CONVERT(VARCHAR,([colz].[max_length] / 2))
                           + ') '
                           + SPACE(6 - LEN(CONVERT(VARCHAR,([colz].[max_length] / 2))))
                           + SPACE(7)
                           + SPACE(@ObjectDataTypeLen - LEN(TYPE_NAME([colz].[user_type_id])))
                           ----collate to comment out when not desired
                           --+ CASE
                           --     WHEN COLS.collation_name IS NULL
                           --     THEN ''
                           --     ELSE ' COLLATE ' + COLS.collation_name
                           --   END
                           + CASE  WHEN [colz].[is_sparse] = 1 THEN ' sparse' ELSE '       ' END
                           + CASE
                               WHEN [colz].[is_nullable] = 0
                               THEN ' NOT NULL'
                               ELSE '     NULL'
                             END
                    END
               WHEN TYPE_NAME([colz].[user_type_id]) IN ('datetime','money','text','image','real')
               THEN SPACE(18 - LEN(TYPE_NAME([colz].[user_type_id])))
                    + '              '
                    + CASE  WHEN [colz].[is_sparse] = 1 THEN ' sparse' ELSE '       ' END
                    + CASE
                        WHEN [colz].[is_nullable] = 0
                        THEN ' NOT NULL'
                        ELSE '     NULL'
                      END
--  other data type 	IE INT, DATETIME, MONEY, CUSTOM DATA TYPE,...
               ELSE SPACE(@ObjectDataTypeLen - LEN(TYPE_NAME([colz].[user_type_id])))
                            + CASE
                                WHEN COLUMNPROPERTY ( @TABLE_ID , [colz].[name] , 'IsIdentity' ) = 0
                                THEN '              '
                                ELSE ' IDENTITY('
                                     + CONVERT(VARCHAR,ISNULL(IDENT_SEED(@TBLNAME),1) )
                                     + ','
                                     + CONVERT(VARCHAR,ISNULL(IDENT_INCR(@TBLNAME),1) )
                                     + ')'
                              END
                            + SPACE(2)
                            + CASE  WHEN [colz].[is_sparse] = 1 THEN ' sparse' ELSE '       ' END
                            + CASE
                                WHEN [colz].[is_nullable] = 0
                                THEN ' NOT NULL'
                                ELSE '     NULL'
                              END
               END
             + CASE
                 WHEN [colz].[default_object_id] = 0
                 THEN ''
                 --ELSE ' DEFAULT '  + ISNULL(def.[definition] ,'')
                 --optional section in case NAMED default constraints are needed:
                 ELSE '  CONSTRAINT ' + QUOTENAME([DEF].[name]) + ' DEFAULT ' + ISNULL([DEF].[definition] ,'')
                        --i thought it needed to be handled differently! NOT!
               END  --CASE cdefault
      END --iscomputed
    + ','
    FROM [sys].[columns] AS [colz]
      LEFT OUTER JOIN  [sys].[default_constraints]  AS [DEF]
        ON [colz].[default_object_id] = [DEF].[object_id]
      LEFT OUTER JOIN [sys].[computed_columns] AS [CALC]
         ON  [colz].[object_id] = [CALC].[object_id]
         AND [colz].[column_id] = [CALC].[column_id]
    WHERE [colz].[object_id]=@TABLE_ID
    ORDER BY [colz].[column_id];
--##############################################################################
--used for formatting the rest of the constraints:
--##############################################################################
  SELECT
    @STRINGLEN = MAX(LEN([objz].[name])) + 1
  FROM [sys].[objects] AS [objz];
--##############################################################################
--PK/Unique Constraints and Indexes, using the 2005/08 INCLUDE syntax
--##############################################################################
  DECLARE @Results  TABLE (
                    [SCHEMA_ID]             INT,
                    [SCHEMA_NAME]           VARCHAR(255),
                    [OBJECT_ID]             INT,
                    [OBJECT_NAME]           VARCHAR(255),
                    [index_id]              INT,
                    [index_name]            VARCHAR(255),
                    [ROWS]                  BIGINT,
                    [SizeMB]                DECIMAL(19,3),
                    [IndexDepth]            INT,
                    [TYPE]                  INT,
                    [type_desc]             VARCHAR(30),
                    [fill_factor]           INT,
                    [is_unique]             INT,
                    [is_primary_key]        INT ,
                    [is_unique_constraint]  INT,
                    [index_columns_key]     VARCHAR(MAX),
                    [index_columns_include] VARCHAR(MAX),
                    [has_filter] BIT ,
                    [filter_definition] VARCHAR(MAX),
                    [currentFilegroupName]  VARCHAR(128),
                    [CurrentCompression]    VARCHAR(128));
  INSERT INTO @Results
    SELECT
      [SCH].[schema_id], [SCH].[name] AS [SCHEMA_NAME],
      [objz].[object_id], [objz].[name] AS [OBJECT_NAME],
      [IDX].[index_id], ISNULL([IDX].[name], '---') AS [index_name],
      [partitions].[ROWS], [partitions].[SizeMB], INDEXPROPERTY([objz].[object_id], [IDX].[name], 'IndexDepth') AS [IndexDepth],
      [IDX].[type], [IDX].[type_desc], [IDX].[fill_factor],
      [IDX].[is_unique], [IDX].[is_primary_key], [IDX].[is_unique_constraint],
      ISNULL([Index_Columns].[index_columns_key], '---') AS [index_columns_key],
      ISNULL([Index_Columns].[index_columns_include], '---') AS [index_columns_include],
      [IDX].[has_filter],
      [IDX].[filter_definition],
      [filz].[name],
      ISNULL([p].[data_compression_desc],'')
    FROM [sys].[objects] AS [objz]
      INNER JOIN [sys].[schemas] AS [SCH] ON [objz].[schema_id]=[SCH].[schema_id]
      INNER JOIN [sys].[indexes] AS [IDX] ON [objz].[object_id]=[IDX].[object_id]
      INNER JOIN [sys].[filegroups] AS [filz] ON [IDX].[data_space_id] = [filz].[data_space_id]
      INNER JOIN [sys].[partitions] AS [p]     ON  [IDX].[object_id] =  [p].[object_id]  AND [IDX].[index_id] = [p].[index_id]
      INNER JOIN (
                  SELECT
                    [statz].[object_id], [statz].[index_id], SUM([statz].[row_count]) AS [ROWS],
                    CONVERT(NUMERIC(19,3), CONVERT(NUMERIC(19,3), SUM([statz].[in_row_reserved_page_count]+[statz].[lob_reserved_page_count]+[statz].[row_overflow_reserved_page_count]))/CONVERT(NUMERIC(19,3), 128)) AS [SizeMB]
                  FROM [sys].[dm_db_partition_stats] AS [statz]
                  GROUP BY [statz].[object_id], [statz].[index_id]
                 ) AS [partitions] 
        ON  [IDX].[object_id]=[partitions].[object_id] 
        AND [IDX].[index_id]=[partitions].[index_id]
    CROSS APPLY (
                 SELECT
                   LEFT([Index_Columns].[index_columns_key], LEN([Index_Columns].[index_columns_key])-1) AS [index_columns_key],
                  LEFT([Index_Columns].[index_columns_include], LEN([Index_Columns].[index_columns_include])-1) AS [index_columns_include]
                 FROM
                      (
                       SELECT
                              (
                              SELECT QUOTENAME([colz].[name]) + CASE WHEN [IXCOLS].[is_descending_key] = 0 THEN ' asc' ELSE ' desc' END + ',' + ' '
                               FROM [sys].[index_columns] AS [IXCOLS]
                                 INNER JOIN [sys].[columns] AS [colz]
                                   ON  [IXCOLS].[column_id]   = [colz].[column_id]
                                   AND [IXCOLS].[object_id] = [colz].[object_id]
                               WHERE [IXCOLS].[is_included_column] = 0
                                 AND [IDX].[object_id] = [IXCOLS].[object_id] 
                                 AND [IDX].[index_id] = [IXCOLS].[index_id]
                               ORDER BY [IXCOLS].[key_ordinal]
                               FOR XML PATH('')
                              ) AS [index_columns_key],
                             (
                             SELECT QUOTENAME([colz].[name]) + ',' + ' '
                              FROM [sys].[index_columns] AS [IXCOLS]
                                INNER JOIN [sys].[columns] AS [colz]
                                  ON  [IXCOLS].[column_id]   = [colz].[column_id]
                                  AND [IXCOLS].[object_id] = [colz].[object_id]
                              WHERE [IXCOLS].[is_included_column] = 1
                                AND [IDX].[object_id] = [IXCOLS].[object_id] 
                                AND [IDX].[index_id] = [IXCOLS].[index_id]
                              ORDER BY [IXCOLS].[index_column_id]
                              FOR XML PATH('')
                             ) AS [index_columns_include]
                      ) AS [Index_Columns]
                ) AS [Index_Columns]
    WHERE [SCH].[name]  LIKE CASE 
                                     WHEN @SCHEMANAME = ''   COLLATE SQL_Latin1_General_CP1_CI_AS
                                     THEN [SCH].[name] 
                                     ELSE @SCHEMANAME 
                                   END
    AND [objz].[name] LIKE CASE 
                                  WHEN @TBLNAME = ''   COLLATE SQL_Latin1_General_CP1_CI_AS 
                                  THEN [objz].[name] 
                                  ELSE @TBLNAME 
                                END
    ORDER BY 
      [SCH].[name], 
      [objz].[name], 
      [IDX].[name];
--@Results table has both PK,s Uniques and indexes in thme...pull them out for adding to funal results:
  SET @CONSTRAINTSQLS = '';
  SET @INDEXSQLS      = '';
  SET @TemporalStatement = '';
  SET @WithStatement = '';
--##############################################################################
  -- Temporal tables
--##############################################################################
  SELECT @TemporalStatement =  ISNULL(@vbCrLf + 'PERIOD FOR SYSTEM_TIME ('
  + MAX(CASE WHEN [colz].[generated_always_type] = 1 THEN [colz].[name] ELSE '' END)
  +','
 + MAX(CASE WHEN [colz].[generated_always_type] = 2 THEN [colz].[name] ELSE '' END)
  +'),','') ,
  @WithStatement = ISNULL(' SYSTEM_VERSIONING = ON (HISTORY_TABLE=' + QUOTENAME(OBJECT_SCHEMA_NAME([objz].[history_table_id])) + '.' + QUOTENAME(OBJECT_NAME([objz].[history_table_id])) + '),' ,'')
  FROM [sys].[tables] [objz]
  INNER JOIN [sys].[columns] [colz] 
  ON [objz].[object_id] = [colz].[object_id]
  WHERE [colz].[object_id] = @TABLE_ID 
  AND [colz].[generated_always_type] > 0
  GROUP BY [colz].[object_id],[objz].[history_table_id]
--##############################################################################
-- memory optimized
--##############################################################################
SELECT @WithStatement  = @WithStatement + ISNULL('MEMORY_OPTIMIZED=ON, DURABILITY=' + [objz].[durability_desc] + ',','') 
FROM [sys].[tables] [objz]
WHERE [objz].[is_memory_optimized] =1
AND [objz].[object_id] = @TABLE_ID 
--##############################################################################
--constraints
--column store indexes are different: the "include" columns for normal indexes as scripted above are the columnstores indexed columns
--add a CASE for that situation.
--##############################################################################
  SELECT @CONSTRAINTSQLS = @CONSTRAINTSQLS 
         + CASE
             WHEN [is_primary_key] = 1 OR [is_unique] = 1
             THEN @vbCrLf
                  + 'CONSTRAINT   '  COLLATE SQL_Latin1_General_CP1_CI_AS + QUOTENAME([index_name]) + ' '
                  + CASE  
                      WHEN [is_primary_key] = 1 
                      THEN ' PRIMARY KEY ' 
                      ELSE CASE  
                             WHEN [is_unique] = 1     
                             THEN ' UNIQUE      '      
                             ELSE '' 
                           END 
                    END
                  + [type_desc] 
                  + CASE 
                      WHEN [type_desc]='NONCLUSTERED' 
                      THEN '' 
                      ELSE '   ' 
                    END
                  + ' (' + [index_columns_key] + ')'
                  + CASE 
                      WHEN [index_columns_include] <> '---' 
                      THEN ' INCLUDE (' + [index_columns_include] + ')' 
                      ELSE '' 
                    END
                  + CASE
                      WHEN [has_filter] = 1 
                      THEN ' ' + [filter_definition]
                      ELSE ' '
                    END
                  + CASE WHEN [fill_factor] <> 0 OR [CurrentCompression] <> 'NONE'
                  THEN ' WITH (' + CASE
                                    WHEN [fill_factor] <> 0 
                                    THEN 'FILLFACTOR = ' + CONVERT(VARCHAR(30),[fill_factor]) 
                                    ELSE '' 
                                  END
                                + CASE
                                    WHEN [fill_factor] <> 0  AND [CurrentCompression] <> 'NONE' THEN ',DATA_COMPRESSION = ' + [CurrentCompression] + ' '
                                    WHEN [fill_factor] <> 0  AND [CurrentCompression]  = 'NONE' THEN ''
                                    WHEN [fill_factor]  = 0  AND [CurrentCompression] <> 'NONE' THEN 'DATA_COMPRESSION = ' + [CurrentCompression] + ' '
                                    ELSE '' 
                                  END
                                  + ')'
                  ELSE '' 
                  END 
                      
             ELSE ''
           END + ','
  FROM @Results
  WHERE [type_desc] != 'HEAP'
    AND [is_primary_key] = 1 
    OR  [is_unique] = 1
  ORDER BY 
    [is_primary_key] DESC,
    [is_unique] DESC;
    --
--##############################################################################
--indexes
--##############################################################################
  SELECT @INDEXSQLS = @INDEXSQLS 
         + CASE
             WHEN [is_primary_key] = 0 OR [is_unique] = 0
             THEN @vbCrLf
                  + 'CREATE '  COLLATE SQL_Latin1_General_CP1_CI_AS + [type_desc] + ' INDEX '  COLLATE SQL_Latin1_General_CP1_CI_AS + QUOTENAME([index_name]) + ' '
                  + @vbCrLf
                  + '   ON '   COLLATE SQL_Latin1_General_CP1_CI_AS
                  + QUOTENAME([SCHEMA_NAME]) + '.' + QUOTENAME([OBJECT_NAME])
                  + CASE 
                        WHEN [CurrentCompression] = 'COLUMNSTORE'  COLLATE SQL_Latin1_General_CP1_CI_AS
                        THEN ' (' + [index_columns_include] + ')' 
                        ELSE ' (' + [index_columns_key] + ')'
                    END
                  + CASE 
                      WHEN [CurrentCompression] = 'COLUMNSTORE'  COLLATE SQL_Latin1_General_CP1_CI_AS
                      THEN ''  COLLATE SQL_Latin1_General_CP1_CI_AS
                      ELSE
                        CASE
                     WHEN [index_columns_include] <> '---' 
                     THEN @vbCrLf + '   INCLUDE ('  COLLATE SQL_Latin1_General_CP1_CI_AS + [index_columns_include] + ')'   COLLATE SQL_Latin1_General_CP1_CI_AS
                     ELSE ''   COLLATE SQL_Latin1_General_CP1_CI_AS
                   END
                    END
                  --2008 filtered indexes syntax
                  + CASE 
                      WHEN [has_filter] = 1 
                      THEN @vbCrLf + '   WHERE '  COLLATE SQL_Latin1_General_CP1_CI_AS + [filter_definition]
                      ELSE ''
                    END
                  + CASE WHEN [fill_factor] <> 0 OR [CurrentCompression] <> 'NONE'  COLLATE SQL_Latin1_General_CP1_CI_AS
                  THEN ' WITH ('  COLLATE SQL_Latin1_General_CP1_CI_AS + CASE
                                    WHEN [fill_factor] <> 0 
                                    THEN 'FILLFACTOR = '  COLLATE SQL_Latin1_General_CP1_CI_AS + CONVERT(VARCHAR(30),[fill_factor]) 
                                    ELSE '' 
                                  END
                                + CASE
                                    WHEN [fill_factor] <> 0  AND [CurrentCompression] <> 'NONE' THEN ',DATA_COMPRESSION = ' + [CurrentCompression]+' '
                                    WHEN [fill_factor] <> 0  AND [CurrentCompression]  = 'NONE' THEN ''
                                    WHEN [fill_factor]  = 0  AND [CurrentCompression] <> 'NONE' THEN 'DATA_COMPRESSION = ' + [CurrentCompression]+' '
                                    ELSE '' 
                                  END
                                  + ')'
                  ELSE '' 
                  END 
           END
  FROM @Results
  WHERE [type_desc] != 'HEAP'
    AND [is_primary_key] = 0 
    AND [is_unique] = 0
  ORDER BY 
    [is_primary_key] DESC,
    [is_unique] DESC;
  IF @INDEXSQLS <> ''  COLLATE SQL_Latin1_General_CP1_CI_AS
    SET @INDEXSQLS = @vbCrLf + 'GO'  COLLATE SQL_Latin1_General_CP1_CI_AS + @vbCrLf + @INDEXSQLS;
--##############################################################################
--CHECK Constraints
--##############################################################################
  SET @CHECKCONSTSQLS = ''  COLLATE SQL_Latin1_General_CP1_CI_AS;
  SELECT
    @CHECKCONSTSQLS = @CHECKCONSTSQLS
    + @vbCrLf
    + ISNULL('CONSTRAINT   ' + QUOTENAME([objz].[name]) + ' '
    + SPACE(@STRINGLEN - LEN([objz].[name]))
    + ' CHECK ' + ISNULL([CHECKS].[definition],'')
    + ',','')
  FROM [sys].[objects] AS [objz]
    INNER JOIN [sys].[check_constraints] AS [CHECKS] ON [objz].[object_id] = [CHECKS].[object_id]
  WHERE [objz].[type] = 'C'
    AND [objz].[parent_object_id] = @TABLE_ID;
--##############################################################################
--FOREIGN KEYS
--##############################################################################
  SET @FKSQLS = '' ;
    SELECT
    @FKSQLS=@FKSQLS
    + @vbCrLf + [MyAlias].[Command] FROM
(
SELECT
  DISTINCT
  --FK must be added AFTER the PK/unique constraints are added back.
  850 AS [ExecutionOrder],
  'CONSTRAINT ' 
  + QUOTENAME([conz].[name]) 
  + ' FOREIGN KEY (' 
  + [ChildCollection].[ChildColumns] 
  + ') REFERENCES ' 
  + QUOTENAME(SCHEMA_NAME([conz].[schema_id])) 
  + '.' 
  + QUOTENAME(OBJECT_NAME([conz].[referenced_object_id])) 
  + ' (' + [ParentCollection].[ParentColumns] 
  + ') ' 
  +  CASE [conz].[update_referential_action]
                                        WHEN 0 THEN '' --' ON UPDATE NO ACTION '
                                        WHEN 1 THEN ' ON UPDATE CASCADE '
                                        WHEN 2 THEN ' ON UPDATE SET NULL '
                                        ELSE ' ON UPDATE SET DEFAULT '
                                    END
                  + CASE [conz].[delete_referential_action]
                                        WHEN 0 THEN '' --' ON DELETE NO ACTION '
                                        WHEN 1 THEN ' ON DELETE CASCADE '
                                        WHEN 2 THEN ' ON DELETE SET NULL '
                                        ELSE ' ON DELETE SET DEFAULT '
                                    END
                  + CASE [conz].[is_not_for_replication]
                        WHEN 1 THEN ' NOT FOR REPLICATION '
                        ELSE ''
                    END
  + ',' AS [Command]
FROM   [sys].[foreign_keys] AS [conz]
       INNER JOIN [sys].[foreign_key_columns] AS [colz]
         ON [conz].[object_id] = [colz].[constraint_object_id]
      
       INNER JOIN (--gets my child tables column names   
SELECT
 [conz].[name],
 --technically, FK's can contain up to 16 columns, but real life is often a single column. coding here is for all columns
 [ChildColumns] = STUFF((SELECT 
                         ',' + QUOTENAME([REFZ].[name])
                       FROM   [sys].[foreign_key_columns] AS [fkcolz]
                              INNER JOIN [sys].[columns] AS [REFZ]
                                ON [fkcolz].[parent_object_id] = [REFZ].[object_id]
                                   AND [fkcolz].[parent_column_id] = [REFZ].[column_id]
                       WHERE [fkcolz].[parent_object_id] = [conz].[parent_object_id]
                           AND [fkcolz].[constraint_object_id] = [conz].[object_id]
                         ORDER  BY
                        [fkcolz].[constraint_column_id]
                      FOR XML PATH(''), TYPE).[value]('.','varchar(max)'),1,1,'')
FROM   [sys].[foreign_keys] AS [conz]
      INNER JOIN [sys].[foreign_key_columns] AS [colz]
        ON [conz].[object_id] = [colz].[constraint_object_id]
        WHERE [conz].[parent_object_id]= @TABLE_ID
GROUP  BY
[conz].[name],
[conz].[parent_object_id],--- without GROUP BY multiple rows are returned
 [conz].[object_id]
    ) AS [ChildCollection]
         ON [conz].[name] = [ChildCollection].[name]
       INNER JOIN (--gets the parent tables column names for the FK reference
                  SELECT
                     [conz].[name],
                     [ParentColumns] = STUFF((SELECT
                                              ',' + [REFZ].[name]
                                            FROM   [sys].[foreign_key_columns] AS [fkcolz]
                                                   INNER JOIN [sys].[columns] AS [REFZ]
                                                     ON [fkcolz].[referenced_object_id] = [REFZ].[object_id]
                                                        AND [fkcolz].[referenced_column_id] = [REFZ].[column_id]
                                            WHERE  [fkcolz].[referenced_object_id] = [conz].[referenced_object_id]
                                              AND [fkcolz].[constraint_object_id] = [conz].[object_id]
                                            ORDER BY [fkcolz].[constraint_column_id]
                                            FOR XML PATH(''), TYPE).[value]('.','varchar(max)'),1,1,'')
                   FROM   [sys].[foreign_keys] AS [conz]
                          INNER JOIN [sys].[foreign_key_columns] AS [colz]
                            ON [conz].[object_id] = [colz].[constraint_object_id]
                           -- AND colz.parent_column_id 
                   GROUP  BY
                    [conz].[name],
                    [conz].[referenced_object_id],--- without GROUP BY multiple rows are returned
                    [conz].[object_id]
                  ) AS [ParentCollection]
         ON [conz].[name] = [ParentCollection].[name]
)AS [MyAlias];
--##############################################################################
--RULES
--##############################################################################
  SET @RULESCONSTSQLS = '';
  SELECT
    @RULESCONSTSQLS = @RULESCONSTSQLS
    + ISNULL(
             @vbCrLf
             + 'if not exists(SELECT [name] FROM sys.objects WHERE TYPE=''R'' AND schema_id = ' COLLATE SQL_Latin1_General_CP1_CI_AS + CONVERT(VARCHAR(30),[objz].[schema_id]) + ' AND [name] = '''  COLLATE SQL_Latin1_General_CP1_CI_AS + QUOTENAME(OBJECT_NAME([colz].[rule_object_id])) + ''')'  COLLATE SQL_Latin1_General_CP1_CI_AS + @vbCrLf
             + [MODS].[definition]  + @vbCrLf + 'GO' COLLATE SQL_Latin1_General_CP1_CI_AS +  @vbCrLf
             + 'EXEC sp_binderule  ' + QUOTENAME([objz].[name]) + ', ''' + QUOTENAME(OBJECT_NAME([colz].[object_id])) + '.' + QUOTENAME([colz].[name]) + ''''  COLLATE SQL_Latin1_General_CP1_CI_AS + @vbCrLf + 'GO'  COLLATE SQL_Latin1_General_CP1_CI_AS ,'')
  FROM [sys].[columns] [colz] 
    INNER JOIN [sys].[objects] [objz]
      ON [objz].[object_id] = [colz].[object_id]
    INNER JOIN [sys].[sql_modules] AS [MODS]
      ON [colz].[rule_object_id] = [MODS].[object_id]
  WHERE [colz].[rule_object_id] <> 0
    AND [colz].[object_id] = @TABLE_ID;
--##############################################################################
--TRIGGERS
--##############################################################################
  SET @TRIGGERSTATEMENT = '';
  SELECT
    @TRIGGERSTATEMENT = @TRIGGERSTATEMENT +  @vbCrLf + [MODS].[definition] + @vbCrLf + 'GO'
  FROM [sys].[sql_modules] AS [MODS]
  WHERE [MODS].[object_id] IN(SELECT
                         [objz].[object_id]
                       FROM [sys].[objects] AS [objz]
                       WHERE [objz].[type] = 'TR'
                       AND [objz].[parent_object_id] = @TABLE_ID);
  IF @TRIGGERSTATEMENT <> ''  COLLATE SQL_Latin1_General_CP1_CI_AS
    SET @TRIGGERSTATEMENT = @vbCrLf + 'GO'  COLLATE SQL_Latin1_General_CP1_CI_AS + @vbCrLf + @TRIGGERSTATEMENT;
--##############################################################################
--NEW SECTION QUERY ALL EXTENDED PROPERTIES
--##############################################################################
  SET @EXTENDEDPROPERTIES = '';
  SELECT  @EXTENDEDPROPERTIES =
          @EXTENDEDPROPERTIES + @vbCrLf +
         'EXEC sys.sp_addextendedproperty
          @name = N'''  COLLATE SQL_Latin1_General_CP1_CI_AS + [name] + ''', @value = N'''  COLLATE SQL_Latin1_General_CP1_CI_AS + REPLACE(CONVERT(VARCHAR(MAX),[value]),'''','''''') + ''',
          @level0type = N''SCHEMA'', @level0name = '  COLLATE SQL_Latin1_General_CP1_CI_AS + QUOTENAME(@SCHEMANAME) + ',
          @level1type = N''TABLE'', @level1name = '  COLLATE SQL_Latin1_General_CP1_CI_AS + QUOTENAME(@TBLNAME) + ';'
 --SELECT objtype, objname, name, value
  FROM [sys].[fn_listextendedproperty] (NULL, 'schema', @SCHEMANAME, 'table', @TBLNAME, NULL, NULL);
  --OMacoder suggestion for column extended properties http://www.sqlservercentral.com/Forums/FindPost1651606.aspx
   ;WITH [obj] AS (
	SELECT [split].[a].[value]('.', 'VARCHAR(20)') AS [name]
	FROM ( 
		SELECT CAST ('<M>' + REPLACE('column,constraint,index,trigger,parameter', ',', '</M><M>') + '</M>' AS XML) AS [data] 
		) AS [A] 
		CROSS APPLY [data].[nodes] ('/M') AS [split]([a])
	)
  SELECT 
  @EXTENDEDPROPERTIES =
		 @EXTENDEDPROPERTIES + @vbCrLf + @vbCrLf +
         'EXEC sys.sp_addextendedproperty
         @name = N''' COLLATE SQL_Latin1_General_CP1_CI_AS
         + [lep].[name] 
         + ''', @value = N''' COLLATE SQL_Latin1_General_CP1_CI_AS
         + REPLACE(CONVERT(VARCHAR(MAX),[lep].[value]),'''','''''') + ''',
         @level0type = N''SCHEMA'', @level0name = ' COLLATE SQL_Latin1_General_CP1_CI_AS
         + QUOTENAME(@SCHEMANAME) 
         + ',
         @level1type = N''TABLE'', @level1name = ' COLLATE SQL_Latin1_General_CP1_CI_AS
         + QUOTENAME(@TBLNAME) 
         + ',
         @level2type = N''' COLLATE SQL_Latin1_General_CP1_CI_AS
         + UPPER([obj].[name])  
         + ''', @level2name = ' COLLATE SQL_Latin1_General_CP1_CI_AS
         + QUOTENAME([lep].[objname]) + ';' COLLATE SQL_Latin1_General_CP1_CI_AS
  --SELECT objtype, objname, name, value
  FROM [obj] 
	CROSS APPLY [sys].[fn_listextendedproperty] (NULL, 'schema', @SCHEMANAME, 'table', @TBLNAME, [obj].[name], NULL) AS [lep];  
  
  IF @EXTENDEDPROPERTIES <> '' COLLATE SQL_Latin1_General_CP1_CI_AS
    SET @EXTENDEDPROPERTIES = @vbCrLf + 'GO' COLLATE SQL_Latin1_General_CP1_CI_AS + @vbCrLf + @EXTENDEDPROPERTIES;
--##############################################################################
--FINAL CLEANUP AND PRESENTATION
--##############################################################################
--at this point, there is a trailing comma, or it blank
--WITH statment has a trailing comma

IF @WithStatement > '' 
  SET @WithStatement='WITH (' + SUBSTRING(@WithStatement,1,LEN(@WithStatement) -1)  + ')'
  SELECT
    @FINALSQL = @FINALSQL
                + @TemporalStatement
                + @CONSTRAINTSQLS
                + @CHECKCONSTSQLS
                + @FKSQLS;
--note that this trims the trailing comma from the end of the statements
  SET @FINALSQL = SUBSTRING(@FINALSQL,1,LEN(@FINALSQL) -1) ;
  SET @FINALSQL = @FINALSQL + ')' COLLATE SQL_Latin1_General_CP1_CI_AS +  @vbCrLf + @WithStatement COLLATE SQL_Latin1_General_CP1_CI_AS +  @vbCrLf ;
  SET @input = @vbCrLf
       + @FINALSQL
       + @INDEXSQLS
       + @RULESCONSTSQLS
       + @TRIGGERSTATEMENT
       + @EXTENDEDPROPERTIES;
  SELECT @input AS [Item];
  RETURN 0;     
--##############################################################################
-- END Normal Table Processing
--############################################################################## 
    
--simple, primitive version to get the results of a TEMP table from the TEMP db.  
--##############################################################################
-- NEW Temp Table Logic
--##############################################################################     
TEMPPROCESS:
  SELECT @TABLE_ID = OBJECT_ID('tempdb..' COLLATE SQL_Latin1_General_CP1_CI_AS + @TBLNAME);
--##############################################################################
-- Valid temp Table, Continue Processing
--##############################################################################
SELECT @FINALSQL = 
     CASE 
       WHEN [tabz].[history_table_id] IS NULL 
       THEN '' 
       ELSE 'ALTER TABLE ' + QUOTENAME(OBJECT_SCHEMA_NAME([tabz].[object_id]) ) + '.' + QUOTENAME(OBJECT_NAME([tabz].[object_id])) + ' SET (SYSTEM_VERSIONING = OFF);' + @vbCrLf
            +  'IF OBJECT_ID(''' + QUOTENAME(OBJECT_SCHEMA_NAME([tabz].[history_table_id]) ) + '.' + QUOTENAME(OBJECT_NAME([tabz].[history_table_id])) + ''') IS NOT NULL ' + @vbCrLf
              + 'DROP TABLE ' + QUOTENAME(OBJECT_SCHEMA_NAME([tabz].[history_table_id])) + '.' + QUOTENAME(OBJECT_NAME([tabz].[history_table_id])) + ' ' + @vbCrLf + 'GO' + @vbCrLf
       END
    + 'IF OBJECT_ID(''' + QUOTENAME(OBJECT_SCHEMA_NAME([tabz].[object_id]) ) + '.' + QUOTENAME(OBJECT_NAME([tabz].[object_id])) + ''') IS NOT NULL ' + @vbCrLf
              + 'DROP TABLE ' + QUOTENAME(OBJECT_SCHEMA_NAME([tabz].[object_id])) + '.' + QUOTENAME(OBJECT_NAME([tabz].[object_id])) + ' ' + @vbCrLf + 'GO' + @vbCrLf
              + 'CREATE TABLE ' + QUOTENAME(OBJECT_SCHEMA_NAME([tabz].[object_id])) + '.' + QUOTENAME(OBJECT_NAME([tabz].[object_id])) + ' ( '
FROM [sys].[tables] [tabz] WHERE [tabz].[object_id] = OBJECT_ID(@TABLE_ID)
  --removed invalid code here which potentially selected wrong table--thansk David Grifiths @SSC!
SELECT 
    @STRINGLEN = MAX(LEN([colz].[name])) + 1
  FROM [tempdb].[sys].[objects] AS [objz]
    INNER JOIN [tempdb].[sys].[columns] AS [colz]
      ON  [objz].[object_id] = [colz].[object_id]
      AND [objz].[object_id] = @TABLE_ID;
--##############################################################################
--Get the hash index definitions for memory optimized tables, if any.
--##############################################################################

--##############################################################################
--Get the columns, their definitions and defaults.
--##############################################################################
  SELECT
    @FINALSQL = @FINALSQL
    + CASE
        WHEN [colz].[is_computed] = 1
        THEN @vbCrLf
             + QUOTENAME([colz].[name])
             + ' '
             + SPACE(@STRINGLEN - LEN([colz].[name]))
             + 'AS ' + ISNULL([CALC].[definition],'')
              + CASE 
                 WHEN [CALC].[is_persisted] = 1 
                 THEN ' PERSISTED'
                 ELSE ''
               END
        ELSE @vbCrLf
             + QUOTENAME([colz].[name])
             + ' '
             + SPACE(@STRINGLEN - LEN([colz].[name]))
             + UPPER(TYPE_NAME([colz].[user_type_id]))
             + CASE
-- data types with precision and scale  IE DECIMAL(18,3), NUMERIC(10,2)
               WHEN TYPE_NAME([colz].[user_type_id]) IN ('decimal','numeric')
               THEN '('
                    + CONVERT(VARCHAR,[colz].[precision])
                    + ','
                    + CONVERT(VARCHAR,[colz].[scale])
                    + ') '
                    + SPACE(6 - LEN(CONVERT(VARCHAR,[colz].[precision])
                    + ','
                    + CONVERT(VARCHAR,[colz].[scale])))
                    + SPACE(7)
                    + SPACE(16 - LEN(TYPE_NAME([colz].[user_type_id])))
                    + CASE
                        WHEN [colz].[is_identity] = 1
                        THEN ' IDENTITY(1,1)'
                        ELSE ''
                        ----WHEN COLUMNPROPERTY ( @TABLE_ID , COLS.[name] , 'IsIdentity' ) = 1
                        ----THEN ' IDENTITY('
                        ----       + CONVERT(VARCHAR,ISNULL(IDENT_SEED('tempdb..' + @TBLNAME),1) )
                        ----       + ','
                        ----       + CONVERT(VARCHAR,ISNULL(IDENT_INCR('tempdb..' + @TBLNAME),1) )
                        ----       + ')'
                        ----ELSE ''
                        END
                    + CASE  WHEN [colz].[is_sparse] = 1 THEN ' sparse' ELSE '       ' END
                    + CASE
                        WHEN [colz].[is_nullable] = 0
                        THEN ' NOT NULL'
                        ELSE '     NULL'
                      END
-- data types with scale  IE datetime2(7),TIME(7)
               WHEN TYPE_NAME([colz].[user_type_id]) IN ('datetime2','datetimeoffset','time')
               THEN CASE 
                      WHEN [colz].[scale] < 7 THEN
                      '('
                      + CONVERT(VARCHAR,[colz].[scale])
                      + ') '
                    ELSE 
                      '    '
                    END
                    + SPACE(4)
                    + SPACE(@ObjectDataTypeLen - LEN(TYPE_NAME([colz].[user_type_id])))
                    + '        '
                    + CASE  WHEN [colz].[is_sparse] = 1 THEN ' sparse' ELSE '       ' END
                    + CASE [colz].[generated_always_type]
                        WHEN 0 THEN ''
                        WHEN 1 THEN ' GENERATED ALWAYS AS ROW START'
                        WHEN 2 THEN ' GENERATED ALWAYS AS ROW END'
                        ELSE ''
                      END 
                    + CASE WHEN [colz].[is_hidden] = 1 THEN ' HIDDEN' ELSE '' END
                    + CASE
                        WHEN [colz].[is_nullable] = 0
                        THEN ' NOT NULL'
                        ELSE '     NULL'
                      END
--data types with no/precision/scale,IE  FLOAT
               WHEN  TYPE_NAME([colz].[user_type_id]) IN ('float') --,'real')
               THEN
               --addition: if 53, no need to specifically say (53), otherwise display it
                    CASE
                      WHEN [colz].[precision] = 53
                      THEN SPACE(11 - LEN(CONVERT(VARCHAR,[colz].[precision])))
                           + SPACE(7)
                           + SPACE(@ObjectDataTypeLen - LEN(TYPE_NAME([colz].[user_type_id])))
                           + CASE  WHEN [colz].[is_sparse] = 1 THEN ' sparse' ELSE '       ' END
                           + CASE
                               WHEN [colz].[is_nullable] = 0
                               THEN ' NOT NULL'
                               ELSE '     NULL'
                             END
                      ELSE '('
                           + CONVERT(VARCHAR,[colz].[precision])
                           + ') '
                           + SPACE(6 - LEN(CONVERT(VARCHAR,[colz].[precision])))
                           + SPACE(7) + SPACE(@ObjectDataTypeLen - LEN(TYPE_NAME([colz].[user_type_id])))
                           + CASE  WHEN [colz].[is_sparse] = 1 THEN ' sparse' ELSE '       ' END
                           + CASE
                               WHEN [colz].[is_nullable] = 0
                               THEN ' NOT NULL'
                               ELSE '     NULL'
                             END
                      END
--ie VARCHAR(40)
--##############################################################################
-- COLLATE STATEMENTS in tempdb!
-- personally i do not like collation statements,
-- but included here to make it easy on those who do
--##############################################################################
               WHEN  TYPE_NAME([colz].[user_type_id]) IN ('char','varchar','binary','varbinary')
               THEN CASE
                      WHEN  [colz].[max_length] = -1
                      THEN  '(max)'
                            + SPACE(6 - LEN(CONVERT(VARCHAR,[colz].[max_length])))
                            + SPACE(7) + SPACE(@ObjectDataTypeLen - LEN(TYPE_NAME([colz].[user_type_id])))
                            ----collate to comment out when not desired
                            --+ CASE
                            --    WHEN COLS.collation_name IS NULL
                            --    THEN ''
                            --    ELSE ' COLLATE ' + COLS.collation_name
                            --  END
                            + CASE  WHEN [colz].[is_sparse] = 1 THEN ' sparse' ELSE '       ' END
                            + CASE
                                WHEN [colz].[is_nullable] = 0
                                THEN ' NOT NULL'
                                ELSE '     NULL'
                              END
                      ELSE '('
                           + CONVERT(VARCHAR,[colz].[max_length])
                           + ') '
                           + SPACE(6 - LEN(CONVERT(VARCHAR,[colz].[max_length])))
                           + SPACE(7) + SPACE(@ObjectDataTypeLen - LEN(TYPE_NAME([colz].[user_type_id])))
                           ----collate to comment out when not desired
                           --+ CASE
                           --     WHEN COLS.collation_name IS NULL
                           --     THEN ''
                           --     ELSE ' COLLATE ' + COLS.collation_name
                           --   END
                           + CASE  WHEN [colz].[is_sparse] = 1 THEN ' sparse' ELSE '       ' END
                           + CASE
                               WHEN [colz].[is_nullable] = 0
                               THEN ' NOT NULL'
                               ELSE '     NULL'
                             END
                    END
--data type with max_length ( BUT DOUBLED) ie NCHAR(33), NVARCHAR(40)
               WHEN TYPE_NAME([colz].[user_type_id]) IN ('nchar','nvarchar')
               THEN CASE
                      WHEN  [colz].[max_length] = -1
                      THEN '(max)'
                           + SPACE(5 - LEN(CONVERT(VARCHAR,([colz].[max_length] / 2))))
                           + SPACE(7)
                           + SPACE(@ObjectDataTypeLen - LEN(TYPE_NAME([colz].[user_type_id])))
                           -- --collate to comment out when not desired
                           --+ CASE
                           --     WHEN COLS.collation_name IS NULL
                           --     THEN ''
                           --     ELSE ' COLLATE ' + COLS.collation_name
                           --   END
                           + CASE  WHEN [colz].[is_sparse] = 1 THEN ' sparse' ELSE '       ' END
                           + CASE
                               WHEN [colz].[is_nullable] = 0
                               THEN  ' NOT NULL'
                               ELSE '     NULL'
                             END
                      ELSE '('
                           + CONVERT(VARCHAR,([colz].[max_length] / 2))
                           + ') '
                           + SPACE(6 - LEN(CONVERT(VARCHAR,([colz].[max_length] / 2))))
                           + SPACE(7)
                           + SPACE(@ObjectDataTypeLen - LEN(TYPE_NAME([colz].[user_type_id])))
                           -- --collate to comment out when not desired
                           --+ CASE
                           --     WHEN COLS.collation_name IS NULL
                           --     THEN ''
                           --     ELSE ' COLLATE ' + COLS.collation_name
                           --   END
                           + CASE  WHEN [colz].[is_sparse] = 1 THEN ' sparse' ELSE '       ' END
                           + CASE
                               WHEN [colz].[is_nullable] = 0
                               THEN ' NOT NULL'
                               ELSE '     NULL'
                             END
                    END
--  other data type 	IE INT, DATETIME, MONEY, CUSTOM DATA TYPE,...
               WHEN TYPE_NAME([colz].[user_type_id]) IN ('datetime','money','text','image','real')
               THEN SPACE(18 - LEN(TYPE_NAME([colz].[user_type_id])))
                    + '              '
                    + CASE  WHEN [colz].[is_sparse] = 1 THEN ' sparse' ELSE '       ' END
                    + CASE
                        WHEN [colz].[is_nullable] = 0
                        THEN ' NOT NULL'
                        ELSE '     NULL'
                      END
--IE INT
               ELSE SPACE(@ObjectDataTypeLen - LEN(TYPE_NAME([colz].[user_type_id])))
                            + CASE
                                WHEN [colz].[is_identity] = 1
                                THEN ' IDENTITY(1,1)'
                                ELSE '              '
                                ----WHEN COLUMNPROPERTY ( @TABLE_ID , COLS.[name] , 'IsIdentity' ) = 1
                                ----THEN ' IDENTITY('
                                ----     + CONVERT(VARCHAR,ISNULL(IDENT_SEED('tempdb..' + @TBLNAME),1) )
                                ----     + ','
                                ----     + CONVERT(VARCHAR,ISNULL(IDENT_INCR('tempdb..' + @TBLNAME),1) )
                                ----     + ')'
                                ----ELSE '              '
                              END
                            + SPACE(2)
                            + CASE  WHEN [colz].[is_sparse] = 1 THEN ' sparse' ELSE '       ' END
                            + CASE
                                WHEN [colz].[is_nullable] = 0
                                THEN ' NOT NULL'
                                ELSE '     NULL'
                              END
               END
             + CASE
                 WHEN [colz].[default_object_id] = 0
                 THEN ''
                 ELSE ' DEFAULT '  + ISNULL([DEF].[definition] ,'')
                 --optional section in case NAMED default cosntraints are needed:
                 --ELSE ' CONSTRAINT [' + DEF.name + '] DEFAULT '+ REPLACE(REPLACE(ISNULL(DEF.[definition] ,''),'((','('),'))',')')
                        --i thought it needed to be handled differently! NOT!
               END  --CASE cdefault
      END --iscomputed
    + ','
    FROM [tempdb].[sys].[columns] AS [colz]
      LEFT OUTER JOIN  [tempdb].[sys].[default_constraints]  AS [DEF]
        ON [colz].[default_object_id] = [DEF].[object_id]
      LEFT OUTER JOIN [tempdb].[sys].[computed_columns] AS [CALC]
         ON  [colz].[object_id] = [CALC].[object_id]
         AND [colz].[column_id] = [CALC].[column_id]
    WHERE [colz].[object_id]=@TABLE_ID
    ORDER BY [colz].[column_id];
--##############################################################################
--used for formatting the rest of the constraints:
--##############################################################################
  SELECT
    @STRINGLEN = MAX(LEN([objz].[name])) + 1
  FROM [tempdb].[sys].[objects] AS [objz];
--##############################################################################
--PK/Unique Constraints and Indexes, using the 2005/08 INCLUDE syntax
--##############################################################################
  DECLARE @Results2  TABLE (
                    [SCHEMA_ID]             INT,
                    [SCHEMA_NAME]           VARCHAR(255),
                    [OBJECT_ID]             INT,
                    [OBJECT_NAME]           VARCHAR(255),
                    [index_id]              INT,
                    [index_name]            VARCHAR(255),
                    [ROWS]                  BIGINT,
                    [SizeMB]                DECIMAL(19,3),
                    [IndexDepth]            INT,
                    [TYPE]                  INT,
                    [type_desc]             VARCHAR(30),
                    [fill_factor]           INT,
                    [is_unique]             INT,
                    [is_primary_key]        INT ,
                    [is_unique_constraint]  INT,
                    [index_columns_key]     VARCHAR(MAX),
                    [index_columns_include] VARCHAR(MAX),
                    [has_filter] BIT ,
                    [filter_definition] VARCHAR(MAX),
                    [currentFilegroupName]  VARCHAR(128),
                    [CurrentCompression]    VARCHAR(128));
  INSERT INTO @Results2
    SELECT
      [SCH].[schema_id], [SCH].[name] AS [SCHEMA_NAME],
      [objz].[object_id], [objz].[name] AS [OBJECT_NAME],
      [IDX].[index_id], ISNULL([IDX].[name], '---') AS [index_name],
      [partitions].[ROWS], [partitions].[SizeMB], INDEXPROPERTY([objz].[object_id], [IDX].[name], 'IndexDepth') AS [IndexDepth],
      [IDX].[type], [IDX].[type_desc], [IDX].[fill_factor],
      [IDX].[is_unique], [IDX].[is_primary_key], [IDX].[is_unique_constraint],
      ISNULL([Index_Columns].[index_columns_key], '---') AS [index_columns_key],
      ISNULL([Index_Columns].[index_columns_include], '---') AS [index_columns_include],
      [IDX].[has_filter],
      [IDX].[filter_definition],
      [filz].[name],
      ISNULL([p].[data_compression_desc],'')
    FROM [tempdb].[sys].[objects] AS [objz]
      INNER JOIN [tempdb].[sys].[schemas] AS [SCH] ON [objz].[schema_id]=[SCH].[schema_id]
      INNER JOIN [tempdb].[sys].[indexes] AS [IDX] ON [objz].[object_id]=[IDX].[object_id]
      INNER JOIN [sys].[filegroups] AS [filz] ON [IDX].[data_space_id] = [filz].[data_space_id]
      INNER JOIN [sys].[partitions] AS [p]     ON  [IDX].[object_id] =  [p].[object_id]  AND [IDX].[index_id] = [p].[index_id]
      INNER JOIN (
                  SELECT
                    [statz].[object_id], [statz].[index_id], SUM([statz].[row_count]) AS [ROWS],
                    CONVERT(NUMERIC(19,3), CONVERT(NUMERIC(19,3), SUM([statz].[in_row_reserved_page_count]+[statz].[lob_reserved_page_count]+[statz].[row_overflow_reserved_page_count]))/CONVERT(NUMERIC(19,3), 128)) AS [SizeMB]
                  FROM [tempdb].[sys].[dm_db_partition_stats] AS [statz]
                  GROUP BY [statz].[object_id], [statz].[index_id]
                 ) AS [partitions] 
        ON  [IDX].[object_id]=[partitions].[object_id] 
        AND [IDX].[index_id]=[partitions].[index_id]
    CROSS APPLY (
                 SELECT
                   LEFT([Index_Columns].[index_columns_key], LEN([Index_Columns].[index_columns_key])-1) AS [index_columns_key],
                  LEFT([Index_Columns].[index_columns_include], LEN([Index_Columns].[index_columns_include])-1) AS [index_columns_include]
                 FROM
                      (
                       SELECT
                              (
                              SELECT QUOTENAME([colz].[name]) + CASE WHEN [IXCOLS].[is_descending_key] = 0 THEN ' asc' ELSE ' desc' END + ',' + ' '
                               FROM [tempdb].[sys].[index_columns] AS [IXCOLS]
                                 INNER JOIN [tempdb].[sys].[columns] AS [colz]
                                   ON  [IXCOLS].[column_id]   = [colz].[column_id]
                                   AND [IXCOLS].[object_id] = [colz].[object_id]
                               WHERE [IXCOLS].[is_included_column] = 0
                                 AND [IDX].[object_id] = [IXCOLS].[object_id] 
                                 AND [IDX].[index_id] = [IXCOLS].[index_id]
                               ORDER BY [IXCOLS].[key_ordinal]
                               FOR XML PATH('')
                              ) AS [index_columns_key],
                             (
                             SELECT QUOTENAME([colz].[name]) + ',' + ' '
                              FROM [tempdb].[sys].[index_columns] AS [IXCOLS]
                                INNER JOIN [tempdb].[sys].[columns] AS [colz]
                                  ON  [IXCOLS].[column_id]   = [colz].[column_id]
                                  AND [IXCOLS].[object_id] = [colz].[object_id]
                              WHERE [IXCOLS].[is_included_column] = 1
                                AND [IDX].[object_id] = [IXCOLS].[object_id] 
                                AND [IDX].[index_id] = [IXCOLS].[index_id]
                              ORDER BY [IXCOLS].[index_column_id]
                              FOR XML PATH('')
                             ) AS [index_columns_include]
                      ) AS [Index_Columns]
                ) AS [Index_Columns]
    WHERE [SCH].[name]  LIKE CASE 
                                     WHEN @SCHEMANAME = '' COLLATE SQL_Latin1_General_CP1_CI_AS
                                     THEN [SCH].[name] 
                                     ELSE @SCHEMANAME 
                                   END
    AND [objz].[name] LIKE CASE 
                                  WHEN @TBLNAME = ''  COLLATE SQL_Latin1_General_CP1_CI_AS
                                  THEN [objz].[name] 
                                  ELSE @TBLNAME 
                                END
    ORDER BY 
      [SCH].[name], 
      [objz].[name], 
      [IDX].[name];
--@Results2 table has both PK,s Uniques and indexes in thme...pull them out for adding to funal results:
  SET @CONSTRAINTSQLS = '' COLLATE SQL_Latin1_General_CP1_CI_AS;
  SET @INDEXSQLS      = '' COLLATE SQL_Latin1_General_CP1_CI_AS;
--##############################################################################
--constraints
--##############################################################################
  SELECT @CONSTRAINTSQLS = @CONSTRAINTSQLS 
         + CASE
             WHEN [is_primary_key] = 1 OR [is_unique] = 1
             THEN @vbCrLf
                  + 'CONSTRAINT   '  COLLATE SQL_Latin1_General_CP1_CI_AS + QUOTENAME([index_name]) + ' '
                  + SPACE(@STRINGLEN - LEN([index_name]))
                  + CASE  
                      WHEN [is_primary_key] = 1 
                      THEN ' PRIMARY KEY '  COLLATE SQL_Latin1_General_CP1_CI_AS
                      ELSE CASE  
                             WHEN [is_unique] = 1     
                             THEN ' UNIQUE      '     COLLATE SQL_Latin1_General_CP1_CI_AS  
                             ELSE ''  COLLATE SQL_Latin1_General_CP1_CI_AS
                           END 
                    END
                  + [type_desc] 
                  + CASE 
                      WHEN [type_desc]='NONCLUSTERED' 
                      THEN ''  COLLATE SQL_Latin1_General_CP1_CI_AS
                      ELSE '   ' 
                    END
                  + ' (' + [index_columns_key] + ')'
                  + CASE 
                      WHEN [index_columns_include] <> '---' 
                      THEN ' INCLUDE (' + [index_columns_include] + ')' 
                      ELSE ''  COLLATE SQL_Latin1_General_CP1_CI_AS
                    END
                  + CASE
                      WHEN [has_filter] = 1 
                      THEN ' ' + [filter_definition]
                      ELSE ' '
                    END
                  + CASE WHEN [fill_factor] <> 0 OR [CurrentCompression] <> 'NONE'
                  THEN ' WITH (' + CASE
                                    WHEN [fill_factor] <> 0 
                                    THEN 'FILLFACTOR = ' + CONVERT(VARCHAR(30),[fill_factor]) 
                                    ELSE ''  COLLATE SQL_Latin1_General_CP1_CI_AS
                                  END
                                + CASE
                                    WHEN [fill_factor] <> 0  AND [CurrentCompression] <> 'NONE' THEN ',DATA_COMPRESSION = ' + [CurrentCompression] + ' '
                                    WHEN [fill_factor] <> 0  AND [CurrentCompression]  = 'NONE' THEN ''
                                    WHEN [fill_factor]  = 0  AND [CurrentCompression] <> 'NONE' THEN 'DATA_COMPRESSION = ' + [CurrentCompression] + ' '
                                    ELSE ''  COLLATE SQL_Latin1_General_CP1_CI_AS
                                  END
                                  + ')'
                  ELSE ''  COLLATE SQL_Latin1_General_CP1_CI_AS
                  END 
             ELSE '' COLLATE SQL_Latin1_General_CP1_CI_AS
           END + ','
  FROM @Results2
  WHERE [type_desc] != 'HEAP'
    AND [is_primary_key] = 1 
    OR  [is_unique] = 1
  ORDER BY 
    [is_primary_key] DESC,
    [is_unique] DESC;
--##############################################################################
--indexes
--##############################################################################
  SELECT @INDEXSQLS = @INDEXSQLS 
         + CASE
             WHEN [is_primary_key] = 0 OR [is_unique] = 0
             THEN @vbCrLf
                  + 'CREATE '  COLLATE SQL_Latin1_General_CP1_CI_AS + [type_desc] + ' INDEX '  COLLATE SQL_Latin1_General_CP1_CI_AS + QUOTENAME([index_name]) + ' ' COLLATE SQL_Latin1_General_CP1_CI_AS
                  + @vbCrLf
                  + '   ON '  COLLATE SQL_Latin1_General_CP1_CI_AS
                  + QUOTENAME([SCHEMA_NAME]) + '.' + QUOTENAME([OBJECT_NAME])
                  + CASE 
                        WHEN [CurrentCompression] = 'COLUMNSTORE'  COLLATE SQL_Latin1_General_CP1_CI_AS
                        THEN ' ('  COLLATE SQL_Latin1_General_CP1_CI_AS+ [index_columns_include] + ')'  COLLATE SQL_Latin1_General_CP1_CI_AS
                        ELSE ' ('  COLLATE SQL_Latin1_General_CP1_CI_AS+ [index_columns_key] + ')' COLLATE SQL_Latin1_General_CP1_CI_AS
                    END
                  + CASE 
                      WHEN [CurrentCompression] = 'COLUMNSTORE'  COLLATE SQL_Latin1_General_CP1_CI_AS
                      THEN ''  COLLATE SQL_Latin1_General_CP1_CI_AS
                      ELSE
                        CASE
                     WHEN [index_columns_include] <> '---' 
                     THEN @vbCrLf + '   INCLUDE ('  COLLATE SQL_Latin1_General_CP1_CI_AS + [index_columns_include] + ')'  COLLATE SQL_Latin1_General_CP1_CI_AS 
                     ELSE ''   COLLATE SQL_Latin1_General_CP1_CI_AS
                   END
                    END
                  --2008 filtered indexes syntax
                  + CASE 
                      WHEN [has_filter] = 1 
                      THEN @vbCrLf + '   WHERE '  COLLATE SQL_Latin1_General_CP1_CI_AS + [filter_definition]
                      ELSE ''  COLLATE SQL_Latin1_General_CP1_CI_AS
                    END
                  + CASE WHEN [fill_factor] <> 0 OR [CurrentCompression] <> 'NONE'  COLLATE SQL_Latin1_General_CP1_CI_AS
                  THEN ' WITH ('  COLLATE SQL_Latin1_General_CP1_CI_AS + CASE
                                    WHEN [fill_factor] <> 0 
                                    THEN 'FILLFACTOR = '  COLLATE SQL_Latin1_General_CP1_CI_AS + CONVERT(VARCHAR(30),[fill_factor]) 
                                    ELSE ''  COLLATE SQL_Latin1_General_CP1_CI_AS
                                  END
                                + CASE
                                    WHEN [fill_factor] <> 0  AND [CurrentCompression] <> 'NONE'  COLLATE SQL_Latin1_General_CP1_CI_AS THEN ',DATA_COMPRESSION = ' COLLATE SQL_Latin1_General_CP1_CI_AS + [CurrentCompression] + ' '
                                    WHEN [fill_factor] <> 0  AND [CurrentCompression]  = 'NONE'  COLLATE SQL_Latin1_General_CP1_CI_AS THEN ''  COLLATE SQL_Latin1_General_CP1_CI_AS
                                    WHEN [fill_factor]  = 0  AND [CurrentCompression] <> 'NONE'  COLLATE SQL_Latin1_General_CP1_CI_AS THEN 'DATA_COMPRESSION = '  COLLATE SQL_Latin1_General_CP1_CI_AS+ [CurrentCompression] + ' '
                                    ELSE ''  COLLATE SQL_Latin1_General_CP1_CI_AS
                                  END
                                  + ')' COLLATE SQL_Latin1_General_CP1_CI_AS
                  ELSE ''  COLLATE SQL_Latin1_General_CP1_CI_AS
                  END 
           END
  FROM @Results2
  WHERE [type_desc] != 'HEAP'
    AND [is_primary_key] = 0 
    AND [is_unique] = 0
  ORDER BY 
    [is_primary_key] DESC,
    [is_unique] DESC;
  IF @INDEXSQLS <> '' COLLATE SQL_Latin1_General_CP1_CI_AS
    SET @INDEXSQLS = @vbCrLf + 'GO'  COLLATE SQL_Latin1_General_CP1_CI_AS+ @vbCrLf + @INDEXSQLS;
--##############################################################################
--CHECK Constraints
--##############################################################################
  SET @CHECKCONSTSQLS = '';
  SELECT
    @CHECKCONSTSQLS = @CHECKCONSTSQLS
    + @vbCrLf
    + ISNULL('CONSTRAINT   ' + QUOTENAME([objz].[name]) + ' '
    + SPACE(@STRINGLEN - LEN([objz].[name]))
    + ' CHECK ' + ISNULL([CHECKS].[definition],'')
    + ',','')
  FROM [tempdb].[sys].[objects] AS [objz]
    INNER JOIN [tempdb].[sys].[check_constraints] AS [CHECKS] ON [objz].[object_id] = [CHECKS].[object_id]
  WHERE [objz].[type] = 'C'
    AND [objz].[parent_object_id] = @TABLE_ID;
--##############################################################################
--FOREIGN KEYS
--##############################################################################
  SET @FKSQLS = '' ;
    SELECT
    @FKSQLS=@FKSQLS
    + @vbCrLf + [MyAlias].[Command] FROM
(
SELECT
  DISTINCT
  --FK must be added AFTER the PK/unique constraints are added back.
  850 AS [ExecutionOrder],
  'CONSTRAINT ' 
  + QUOTENAME([conz].[name]) 
  + ' FOREIGN KEY (' 
  + [ChildCollection].[ChildColumns] 
  + ') REFERENCES ' 
  + QUOTENAME(SCHEMA_NAME([conz].[schema_id])) 
  + '.' 
  + QUOTENAME(OBJECT_NAME([conz].[referenced_object_id])) 
  + ' (' + [ParentCollection].[ParentColumns] 
  + ') ' 
   +  CASE [conz].[update_referential_action]
                                        WHEN 0 THEN '' --' ON UPDATE NO ACTION '
                                        WHEN 1 THEN ' ON UPDATE CASCADE '
                                        WHEN 2 THEN ' ON UPDATE SET NULL '
                                        ELSE ' ON UPDATE SET DEFAULT '
                                    END
                  + CASE [conz].[delete_referential_action]
                                        WHEN 0 THEN '' --' ON DELETE NO ACTION '
                                        WHEN 1 THEN ' ON DELETE CASCADE '
                                        WHEN 2 THEN ' ON DELETE SET NULL '
                                        ELSE ' ON DELETE SET DEFAULT '
                                    END
                  + CASE [conz].[is_not_for_replication]
                        WHEN 1 THEN ' NOT FOR REPLICATION '
                        ELSE ''
                    END
  + ',' AS [Command]
FROM   [sys].[foreign_keys] AS [conz]
       INNER JOIN [sys].[foreign_key_columns] AS [colz]
         ON [conz].[object_id] = [colz].[constraint_object_id]
      
       INNER JOIN (--gets my child tables column names   
SELECT
 [conz].[name],
 --technically, FK's can contain up to 16 columns, but real life is often a single column. coding here is for all columns
 [ChildColumns] = STUFF((SELECT 
                         ',' + QUOTENAME([REFZ].[name])
                       FROM   [sys].[foreign_key_columns] AS [fkcolz]
                              INNER JOIN [sys].[columns] AS [REFZ]
                                ON [fkcolz].[parent_object_id] = [REFZ].[object_id]
                                   AND [fkcolz].[parent_column_id] = [REFZ].[column_id]
                       WHERE [fkcolz].[parent_object_id] = [conz].[parent_object_id]
                           AND [fkcolz].[constraint_object_id] = [conz].[object_id]
                         ORDER  BY
                        [fkcolz].[constraint_column_id]
                       FOR XML PATH(''), TYPE).[value]('.','varchar(max)'),1,1,'')
FROM   [sys].[foreign_keys] AS [conz]
      INNER JOIN [sys].[foreign_key_columns] AS [colz]
        ON [conz].[object_id] = [colz].[constraint_object_id]
 WHERE [conz].[parent_object_id]= @TABLE_ID
GROUP  BY
[conz].[name],
[conz].[parent_object_id],--- without GROUP BY multiple rows are returned
 [conz].[object_id]
    ) AS [ChildCollection]
         ON [conz].[name] = [ChildCollection].[name]
       INNER JOIN (--gets the parent tables column names for the FK reference
                  SELECT
                     [conz].[name],
                     [ParentColumns] = STUFF((SELECT
                                              ',' + [REFZ].[name]
                                            FROM   [sys].[foreign_key_columns] AS [fkcolz]
                                                   INNER JOIN [sys].[columns] AS [REFZ]
                                                     ON [fkcolz].[referenced_object_id] = [REFZ].[object_id]
                                                        AND [fkcolz].[referenced_column_id] = [REFZ].[column_id]
                                            WHERE  [fkcolz].[referenced_object_id] = [conz].[referenced_object_id]
                                              AND [fkcolz].[constraint_object_id] = [conz].[object_id]
                                            ORDER BY [fkcolz].[constraint_column_id]
                                            FOR XML PATH(''), TYPE).[value]('.','varchar(max)'),1,1,'')
                   FROM   [sys].[foreign_keys] AS [conz]
                          INNER JOIN [sys].[foreign_key_columns] AS [colz]
                            ON [conz].[object_id] = [colz].[constraint_object_id]
                           -- AND colz.parent_column_id 
                   GROUP  BY
                    [conz].[name],
                    [conz].[referenced_object_id],--- without GROUP BY multiple rows are returned
                    [conz].[object_id]
                  ) AS [ParentCollection]
         ON [conz].[name] = [ParentCollection].[name]
)AS [MyAlias];
--##############################################################################
--RULES
--##############################################################################
  SET @RULESCONSTSQLS = ''  COLLATE SQL_Latin1_General_CP1_CI_AS;
  SELECT
    @RULESCONSTSQLS = @RULESCONSTSQLS
    + ISNULL(
             @vbCrLf
             + 'if not exists(SELECT [name] FROM tempdb.sys.objects WHERE TYPE=''R'' AND schema_id = '  COLLATE SQL_Latin1_General_CP1_CI_AS 
             + CONVERT(VARCHAR(30),[objz].[schema_id]) 
             + ' AND [name] = '''  COLLATE SQL_Latin1_General_CP1_CI_AS
             + QUOTENAME(OBJECT_NAME([colz].[rule_object_id])) 
             + ''')'  COLLATE SQL_Latin1_General_CP1_CI_AS
             + @vbCrLf
             + [MODS].[definition]  + @vbCrLf 
             + 'GO'  COLLATE SQL_Latin1_General_CP1_CI_AS +  @vbCrLf
             + 'EXEC sp_binderule  '  COLLATE SQL_Latin1_General_CP1_CI_AS
             + QUOTENAME([objz].[name]) 
             + ', '''  COLLATE SQL_Latin1_General_CP1_CI_AS 
             + QUOTENAME(OBJECT_NAME([colz].[object_id])) 
             + '.'  COLLATE SQL_Latin1_General_CP1_CI_AS + QUOTENAME([colz].[name]) 
             + ''''  COLLATE SQL_Latin1_General_CP1_CI_AS
             + @vbCrLf 
             + 'GO' ,''  COLLATE SQL_Latin1_General_CP1_CI_AS)
  FROM [tempdb].[sys].[columns] [colz] 
    INNER JOIN [tempdb].[sys].[objects] [objz]
      ON [objz].[object_id] = [colz].[object_id]
    INNER JOIN [tempdb].[sys].[sql_modules] AS [MODS]
      ON [colz].[rule_object_id] = [MODS].[object_id]
  WHERE [colz].[rule_object_id] <> 0
    AND [colz].[object_id] = @TABLE_ID;
--##############################################################################
--TRIGGERS
--##############################################################################
  SET @TRIGGERSTATEMENT = '';
  SELECT
    @TRIGGERSTATEMENT = @TRIGGERSTATEMENT +  @vbCrLf + [MODS].[definition] + @vbCrLf + 'GO'
  FROM [tempdb].[sys].[sql_modules] AS [MODS]
  WHERE [MODS].[object_id] IN(SELECT
                         [objz].[object_id]
                       FROM [tempdb].[sys].[objects] AS [objz]
                       WHERE [objz].[type] = 'TR'
                       AND [objz].[parent_object_id] = @TABLE_ID);
  IF @TRIGGERSTATEMENT <> ''  COLLATE SQL_Latin1_General_CP1_CI_AS
    SET @TRIGGERSTATEMENT = @vbCrLf + 'GO'  COLLATE SQL_Latin1_General_CP1_CI_AS + @vbCrLf + @TRIGGERSTATEMENT;
--##############################################################################
--NEW SECTION QUERY ALL EXTENDED PROPERTIES
--##############################################################################
  SET @EXTENDEDPROPERTIES = ''  COLLATE SQL_Latin1_General_CP1_CI_AS;
  SELECT  @EXTENDEDPROPERTIES =
          @EXTENDEDPROPERTIES + @vbCrLf +
         'EXEC tempdb.sys.sp_addextendedproperty
          @name = N'''  COLLATE SQL_Latin1_General_CP1_CI_AS
          + [name] 
          + ''', @value = N'''  COLLATE SQL_Latin1_General_CP1_CI_AS
          + REPLACE(CONVERT(VARCHAR(MAX),[value]),'''','''''') + ''',
          @level0type = N''SCHEMA'', @level0name = '  COLLATE SQL_Latin1_General_CP1_CI_AS
          + QUOTENAME(@SCHEMANAME + ',
          @level1type = N''TABLE'', @level1name = ['  COLLATE SQL_Latin1_General_CP1_CI_AS
          + @TBLNAME) 
          + '];' COLLATE SQL_Latin1_General_CP1_CI_AS
 --SELECT objtype, objname, name, value
  FROM [sys].[fn_listextendedproperty] (NULL, 'schema', @SCHEMANAME, 'table', @TBLNAME, NULL, NULL);
  --OMacoder suggestion for column extended properties http://www.sqlservercentral.com/Forums/FindPost1651606.aspx
  SELECT @EXTENDEDPROPERTIES =
         @EXTENDEDPROPERTIES + @vbCrLf +
         'EXEC sys.sp_addextendedproperty
         @name = N'''  COLLATE SQL_Latin1_General_CP1_CI_AS
         + [name] 
         + ''', @value = N'''  COLLATE SQL_Latin1_General_CP1_CI_AS
         + REPLACE(CONVERT(VARCHAR(MAX),[value]),'''','''''') 
         + ''',
         @level0type = N''SCHEMA'', @level0name = '  COLLATE SQL_Latin1_General_CP1_CI_AS
         + QUOTENAME(@SCHEMANAME) + ',
         @level1type = N''TABLE'', @level1name = '  COLLATE SQL_Latin1_General_CP1_CI_AS
         + QUOTENAME(@TBLNAME) + ',
         @level2type = N''COLUMN'', @level2name = '  COLLATE SQL_Latin1_General_CP1_CI_AS
         + QUOTENAME([objname]) + ';' COLLATE SQL_Latin1_General_CP1_CI_AS
  --SELECT objtype, objname, name, value
  FROM [sys].[fn_listextendedproperty] (NULL, 'schema', @SCHEMANAME, 'table', @TBLNAME, 'column', NULL);
  IF @EXTENDEDPROPERTIES <> '' COLLATE SQL_Latin1_General_CP1_CI_AS
    SET @EXTENDEDPROPERTIES = @vbCrLf + 'GO' COLLATE SQL_Latin1_General_CP1_CI_AS + @vbCrLf + @EXTENDEDPROPERTIES;
--##############################################################################
--FINAL CLEANUP AND PRESENTATION
--##############################################################################
--at this point, there is a trailing comma, or it blank
  SELECT
    @FINALSQL = @FINALSQL
                + @CONSTRAINTSQLS
                + @CHECKCONSTSQLS
                + @FKSQLS;
--note that this trims the trailing comma from the end of the statements
  SET @FINALSQL = SUBSTRING(@FINALSQL,1,LEN(@FINALSQL) -1) ;
  SET @FINALSQL = @FINALSQL + ')'  COLLATE SQL_Latin1_General_CP1_CI_AS + @vbCrLf ;
  SET @input = @vbCrLf
       + @FINALSQL
       + @INDEXSQLS
       + @RULESCONSTSQLS
       + @TRIGGERSTATEMENT
       + @EXTENDEDPROPERTIES;
  SELECT @input AS [Item];
         
  RETURN 0;     
END; --PROC


SP DB_HELP_ExtensionTableDefExport

			




CREATE procedure [dbo].[DB_INFO_ExtensionTableDefExport]
AS
BEGIN 
	
	PRINT 'UNCOMMENT AND EXECUTE FOR RUNNING PROCEDURE SpAutoUpdateTemplateDoc'
	/*
	
	USE [master];
GO
IF OBJECT_ID('[dbo].[sp_GetDDL]') IS NOT NULL 
DROP  PROCEDURE [dbo].[sp_GetDDL]; 
GO
--#################################################################################################
-- Real World DBA Toolkit Version 2019-08-01 Lowell Izaguirre lowell@stormrage.com
--#################################################################################################
-- USAGE: exec sp_GetDDL GMACT
--   or   exec sp_GetDDL 'bob.example'
--   or   exec sp_GetDDL '[schemaname].[tablename]'
--   or   exec sp_GetDDL #temp
--#################################################################################################
-- copyright 2004-2018 by Lowell Izaguirre scripts*at*stormrage.com all rights reserved.
--developer utility function added by Lowell, used in SQL Server Management Studio 
-- http://www.stormrage.com/SQLStuff/sp_GetDDL_Latest.txt
--Purpose: Script Any Table, Temp Table or Object(Procedure Function Synonym View Table Trigger)
--#################################################################################################
-- see the thread here for lots of details: http://www.sqlservercentral.com/Forums/Topic751783-566-7.aspx
-- You can use this however you like...this script is not rocket science, but it took a bit of work to create.
-- the only thing that I ask
-- is that if you adapt my procedure or make it better, to simply send me a copy of it,
-- so I can learn from the things you've enhanced.The feedback you give will be what makes
-- it worthwhile to me, and will be fed back to the SQL community.
-- add this to your toolbox of helpful scripts.
--#################################################################################################
--
-- V300  uses String concatination and sys.tables instead of a cursor
-- V301  enhanced 07/31/2009 to include extended properties definitions
-- V302  fixes an issue where the schema is created , ie 'bob', but no user named 'bob' owns the schema, so the table is not found
-- V303  fixes an issue where all rules are appearing, instead of jsut the rule related to a column
-- V304  testing whether vbCrLf is better than just CHAR(13), some formatting cleanup with GO statements
--       also fixed an issue with the conversion from syscolumns to sys.columns, max-length is only field we need, not [precision]
-- V305  user feedback helped me find that the type_name function should call user_type_id instead of system_type_id
--       also fixed issue where identity definition missing from numeric/decimal definition
-- V306  fixes the computed columns definition that got broken/removed somehow in V300
--       also formatting when decimal is not an identity
-- V307  fixes bug identified by David Griffiths-491597 from SSC where the  @TABLE_ID
--       is reselected, but without it's schema  , potentially selecting the wrong table
--       also fixed is the missing size definition for varbinary, also found by David Griffith
-- V308  abtracted all SQLs to use Table Alaises
--       added logic to script a temp table.
--       added warning about possibly not being marked as system object.
-- V309  added logic based on feedback from Vincent Wylenzek @SSC to return the definition from sys.sql_modules for
--       any object like procedure/view/function/trigger, and not just a table. 
--       note previously, if you pointed sp_GetDDL at a view, it returned the view definition as a table...
--       now it will return the view definition instead.
-- V309a returns multi row recordset, one line per record 
-- V310a fixed the commented out code related to collation identified by moadh.bs @SSC
--       changed the DEFAULT definitions to not include the default name.
-- V310b Added PERSISTED to calculated columns where applicable
-- V310b fixed COLLATE statement for temp tables
-- V310c fixed NVARCHAR size misreported as doubled.
-- V311  fixed issue where indexes did not identify if the column was ASC or DESC found by nikus @ SSC
-- V311a fixed issue where indexes did not identify if the index was CLUSTERED or NONCLUSTERED found by nikus @ SSC 02/22/2013
-- V312  got rid of all upper casing, and allowing all scripts to generate the exact object names in cases of case sensitive databases.
--       now using the case sensitive name of the table passed: so of you did 'exec sp_GetDDL invoicedocs , it might return the script for InvoiceDocs, as that is how it is spelled in sys.objects.
--       added if exists(drop table/procedure/function) statement to the scripting automatically.
--       toggled the commented out code to list any default constraints by name, hopefully to be more accurate..
--       formatting of index statements to be multi line for better readability
--V314   03/30/2015
--       did i mention this scripts out temp tables too? sp_GetDDL #tmp
--       scripts any object:table,#temptable procedure, function, view or trigger
--       added ability to script synonyms
--       moved logic for REAL datatype to fix error when scripting real columns
--       added OmaCoders suggestion to script column extended properties as well.
--       added matt_slack suggestion to script schemaname as part of index portion of script.
--       minor script cleanup to use QUOTENAME insead of concatenating square brackets.
--       changed compatibility to 2008 and above only, now filtered idnexes with WHERE statmeents script correctly
--       foreign key tables and columns  in script now quotenamed to account for spaces in names; previously an error for Applciation ID instead of [Application ID]
--V315   Fixes Aliases and column names that prevented Case Sensitive collations from working.
--       Adds code if the procedure scripted is a system object
--       index scripts featuring filtered indexes is now included
--       index scripts now include filegroup name and compression settings
--       foreign key casecade delete/update settings now included as identified by Alberto aserio@SSC)
--       Fixes related to scripting extended events  as identified by Alberto aserio@SSC)
--V316   Fixes Identified 07/27/2016 by mlm( m.martinelli@SSC)
--       Added logic  resolving error when custom data type are defined using name greather than 16 char.
--       Added handling for data types: binary, datetime2, datetimeoffset, time
--       Added Set Based logic for Handling Fixed FOREIGN KEYS handling when one foreign key is define on more then one field
--       Added SPARSE column property
--V317   Fixes Identified 03/30/2017 by Lowell
--       Scripting of Foreign key column(s) are now quotenamed
--       Scripting column store indexes was broken, now fixed for column store indexes
--V318   Fixes Identified 02/14/2018 by Lowell
--       Scripting of with collation added/required for scripting SharePoint/ReportServer , or databases with non standard collations
--       Scripting enhanced to definitively handle case sensitive collations as well.
--V319   Adding logic for Temporal Tables, to grab their auto nistory tables
--       first attempt for partitioned tables, to get the columns correctly on the partition scheme
-- DROP PROCEDURE [dbo].[sp_GetDDL]
--#############################################################################
--if you are going to put this in MASTER, and want it to be able to query
--each database's sys.indexes, you MUST mark it as a system procedure:
--EXECUTE sp_ms_marksystemobject 'sp_GetDDL'
--#############################################################################
CREATE PROCEDURE [dbo].[sp_GetDDL]
  @TBL                VARCHAR(255)
AS
BEGIN
  SET NOCOUNT ON;
  DECLARE     @TBLNAME                VARCHAR(200),
              @SCHEMANAME             VARCHAR(255),
              @STRINGLEN              INT,
              @TABLE_ID               INT,
              @FINALSQL               VARCHAR(MAX),
              @CONSTRAINTSQLS         VARCHAR(MAX),
              @CHECKCONSTSQLS         VARCHAR(MAX),
              @RULESCONSTSQLS         VARCHAR(MAX),
              @FKSQLS                 VARCHAR(MAX),
              @TRIGGERSTATEMENT       VARCHAR(MAX),
              @EXTENDEDPROPERTIES     VARCHAR(MAX),
              @INDEXSQLS              VARCHAR(MAX),
              @MARKSYSTEMOBJECT       VARCHAR(MAX),
              @vbCrLf                 CHAR(2),
              @ISSYSTEMOBJECT         INT,
              @PROCNAME               VARCHAR(256),
              @input                  VARCHAR(MAX),
              @ObjectTypeFound        VARCHAR(255),
              @ObjectDataTypeLen      INT,
              --V3.20 additions
              @WithStatement          VARCHAR(MAX),
              @FileGroupStatement     VARCHAR(MAX),
              @PartitioningStatement  VARCHAR(MAX),
              @TemporalStatement      VARCHAR(MAX);
--##############################################################################
-- INITIALIZE
--##############################################################################
  SET @input = '';
  --new code: determine whether this proc is marked as a system proc with sp_ms_marksystemobject,
  --which flips the is_ms_shipped bit in sys.objects
    SELECT @ISSYSTEMOBJECT = ISNULL([is_ms_shipped],0),@PROCNAME = ISNULL([name],'sp_GetDDL') FROM [sys].[objects] WHERE [object_id] = @@PROCID;
  IF @ISSYSTEMOBJECT IS NULL 
    SELECT @ISSYSTEMOBJECT = ISNULL([is_ms_shipped],0),@PROCNAME = ISNULL([name],'sp_GetDDL') FROM [master].[sys].[objects] WHERE [object_id] = @@PROCID;
  IF @ISSYSTEMOBJECT IS NULL 
    SET @ISSYSTEMOBJECT = 0;  
  IF @PROCNAME IS NULL
    SET @PROCNAME = 'sp_GetDDL';
  --SET @TBL =  '[DBO].[WHATEVER1]'
  --does the tablename contain a schema?
  SET @vbCrLf =  CHAR(10);
  SELECT @SCHEMANAME = ISNULL(PARSENAME(@TBL,2),'dbo') ,
         @TBLNAME    = PARSENAME(@TBL,1);
  SELECT
    @TBLNAME    = [objz].[name],
    @TABLE_ID   = [objz].[object_id]
  FROM [sys].[objects] AS [objz]
  WHERE [objz].[type]          IN ('S','U')
    AND [objz].[name]          <>  'dtproperties'
    AND [objz].[name]           =  @TBLNAME
    AND [objz].[schema_id] =  SCHEMA_ID(@SCHEMANAME) ;
 SELECT @ObjectDataTypeLen = MAX(LEN([name])) FROM [sys].[types];
--##############################################################################
-- Check If TEMP TableName is Valid
--##############################################################################
  IF LEFT(@TBLNAME,1) = '#'  COLLATE SQL_Latin1_General_CP1_CI_AS
    BEGIN
      PRINT '--TEMP TABLE  ' + QUOTENAME(@TBLNAME) + '  FOUND';
      IF OBJECT_ID('tempdb..' + QUOTENAME(@TBLNAME)) IS NOT NULL
        BEGIN
          PRINT '--GOIN TO TEMP PROCESSING';
          GOTO TEMPPROCESS;
        END;
    END;
  ELSE
    BEGIN
      PRINT '--Non-Temp Table, ' + QUOTENAME(@TBLNAME) + ' continue Processing';
    END;
--##############################################################################
-- Check If TableName is Valid
--##############################################################################
  IF ISNULL(@TABLE_ID,0) = 0
    BEGIN
      --V309 code: see if it is an object and not a table.
      SELECT
        @TBLNAME    = [objz].[name],
        @TABLE_ID   = [objz].[object_id],
        @ObjectTypeFound = [objz].[type_desc]
      FROM [sys].[objects] AS [objz]
      --WHERE [type_desc]     IN('SQL_STORED_PROCEDURE','VIEW','SQL_TRIGGER','AGGREGATE_FUNCTION','SQL_INLINE_TABLE_VALUED_FUNCTION','SQL_TABLE_VALUED_FUNCTION','SQL_SCALAR_FUNCTION','SYNONYMN')
      WHERE [objz].[type]          IN ('P','V','TR','AF','IF','FN','TF','SN')
        AND [objz].[name]          <>  'dtproperties'
        AND [objz].[name]           =  @TBLNAME
        AND [objz].[schema_id] =  SCHEMA_ID(@SCHEMANAME) ;
      IF ISNULL(@TABLE_ID,0) <> 0  
        BEGIN
          --adding a drop statement.
          --adding a sp_ms_marksystemobject if needed
          SELECT @MARKSYSTEMOBJECT = CASE 
                                       WHEN [objz].[is_ms_shipped] = 1 
                                       THEN '
GO
--#################################################################################################
--Mark as a system object
EXECUTE sp_ms_marksystemobject  ''' + QUOTENAME(@SCHEMANAME) +'.' + QUOTENAME(@TBLNAME) + '''
--#################################################################################################
' 
                                       ELSE '
GO
' 
                                     END 
          FROM [sys].[objects] AS [objz] 
          WHERE [objz].[object_id] = @TABLE_ID;
          --adding a drop statement.
          IF @ObjectTypeFound = 'SYNONYM'  COLLATE SQL_Latin1_General_CP1_CI_AS
            BEGIN
               SELECT @FINALSQL = 
                'IF EXISTS(SELECT * FROM sys.synonyms WHERE name = ''' 
                                + [name] 
                                + ''''
                                + ' AND base_object_name <> ''' + [base_object_name] + ''')'
                                + @vbCrLf
                                + '  DROP SYNONYM ' + QUOTENAME([name]) + ''
                                + @vbCrLf
                                +'GO'
                                + @vbCrLf
                                +'IF NOT EXISTS(SELECT * FROM sys.synonyms WHERE name = ''' 
                                + [name] 
                                + ''')'
                                + @vbCrLf
                                + 'CREATE SYNONYM ' + QUOTENAME([name]) + ' FOR ' + [base_object_name] +';'
                                FROM [sys].[synonyms]
                                WHERE  [name]   =  @TBLNAME
                                AND [schema_id] =  SCHEMA_ID(@SCHEMANAME);
            END;
          ELSE
            BEGIN
          SELECT @FINALSQL = 
          'IF OBJECT_ID(''' + QUOTENAME(@SCHEMANAME) + '.' + QUOTENAME(@TBLNAME) + ''') IS NOT NULL ' + @vbCrLf
          + 'DROP ' + CASE 
                        WHEN [objz].[type] IN ('P')
                        THEN ' PROCEDURE '
                        WHEN [objz].[type] IN ('V')
                        THEN ' VIEW      '
                        WHEN [objz].[type] IN ('TR')
                        THEN ' TRIGGER   '
                        ELSE ' FUNCTION  '
                      END 
                      + QUOTENAME(@SCHEMANAME) + '.' + QUOTENAME(@TBLNAME) + ' ' + @vbCrLf + 'GO' + @vbCrLf
          + [def].[definition] + @MARKSYSTEMOBJECT
          FROM [sys].[objects] AS [objz] 
            INNER JOIN [sys].[sql_modules] AS [def]
              ON [objz].[object_id] = [def].[object_id]
          WHERE [objz].[type]          IN ('P','V','TR','AF','IF','FN','TF')
            AND [objz].[name]          <>  'dtproperties'
            AND [objz].[name]           =  @TBLNAME
            AND [objz].[schema_id] =  SCHEMA_ID(@SCHEMANAME) ;
            END;
          SET @input = @FINALSQL;  
          
        SELECT @input AS [Item];
         RETURN;
        END;
      ELSE
        BEGIN
        SET @FINALSQL = 'Object ' + QUOTENAME(@SCHEMANAME) + '.' + QUOTENAME(@TBLNAME) + ' does not exist in Database ' + QUOTENAME(DB_NAME())   + ' '  
                      + CASE 
                          WHEN @ISSYSTEMOBJECT = 0 THEN @vbCrLf + ' (also note that ' + @PROCNAME + ' is not marked as a system proc and cross db access to sys.tables will fail.)'
                          ELSE ''
                        END;
      IF LEFT(@TBLNAME,1) = '#' 
        SET @FINALSQL = @FINALSQL + ' OR in The tempdb database.';
      SELECT @FINALSQL AS [Item];
      RETURN 0;
        END;  
      
    END;
--##############################################################################
-- Valid Table, Continue Processing
--##############################################################################
--Is this a SYSTEM versioned TABLE?
SELECT @FINALSQL = 
     CASE 
       WHEN [tabz].[history_table_id] IS NULL 
       THEN '' 
       ELSE 'ALTER TABLE ' + QUOTENAME(OBJECT_SCHEMA_NAME([tabz].[object_id]) ) + '.' + QUOTENAME(OBJECT_NAME([tabz].[object_id])) + ' SET (SYSTEM_VERSIONING = OFF);' + @vbCrLf
            +  'IF OBJECT_ID(''' + QUOTENAME(OBJECT_SCHEMA_NAME([tabz].[history_table_id]) ) + '.' + QUOTENAME(OBJECT_NAME([tabz].[history_table_id])) + ''') IS NOT NULL ' + @vbCrLf
              + 'DROP TABLE ' + QUOTENAME(OBJECT_SCHEMA_NAME([tabz].[history_table_id])) + '.' + QUOTENAME(OBJECT_NAME([tabz].[history_table_id])) + ' ' + @vbCrLf + 'GO' + @vbCrLf
       END
    + 'IF OBJECT_ID(''' + QUOTENAME(OBJECT_SCHEMA_NAME([tabz].[object_id]) ) + '.' + QUOTENAME(OBJECT_NAME([tabz].[object_id])) + ''') IS NOT NULL ' + @vbCrLf
              + 'DROP TABLE ' + QUOTENAME(OBJECT_SCHEMA_NAME([tabz].[object_id])) + '.' + QUOTENAME(OBJECT_NAME([tabz].[object_id])) + ' ' + @vbCrLf + 'GO' + @vbCrLf
              + 'CREATE TABLE ' + QUOTENAME(OBJECT_SCHEMA_NAME([tabz].[object_id])) + '.' + QUOTENAME(OBJECT_NAME([tabz].[object_id])) + ' ( '
    FROM [sys].[tables] [tabz] WHERE [tabz].[object_id] = @TABLE_ID
    PRINT @FINALSQL
  --removed invalid code here which potentially selected wrong table--thanks David Grifiths @SSC!
  SELECT
    @STRINGLEN = MAX(LEN([colz].[name])) + 1
  FROM [sys].[objects] AS [objz]
    INNER JOIN [sys].[columns] AS [colz]
      ON  [objz].[object_id] = [colz].[object_id]
      AND [objz].[object_id] = @TABLE_ID;
--##############################################################################
--Get the columns, their definitions and defaults.
--##############################################################################
  SELECT
    @FINALSQL = @FINALSQL
    + CASE
        WHEN [colz].[is_computed] = 1
        THEN @vbCrLf
             + QUOTENAME([colz].[name])
             + ' '
             + SPACE(@STRINGLEN - LEN([colz].[name]))
             + 'AS ' + ISNULL([CALC].[definition],'')
             + CASE 
                 WHEN [CALC].[is_persisted] = 1 
                 THEN ' PERSISTED'
                 ELSE ''
               END
        ELSE @vbCrLf
             + QUOTENAME([colz].[name])
             + ' '
             + SPACE(@STRINGLEN - LEN([colz].[name]))
             + UPPER(TYPE_NAME([colz].[user_type_id]))
             + CASE
-- data types with precision and scale  IE DECIMAL(18,3), NUMERIC(10,2)
               WHEN TYPE_NAME([colz].[user_type_id]) IN ('decimal','numeric')
               THEN '('
                    + CONVERT(VARCHAR,[colz].[precision])
                    + ','
                    + CONVERT(VARCHAR,[colz].[scale])
                    + ') '
                    + SPACE(6 - LEN(CONVERT(VARCHAR,[colz].[precision])
                    + ','
                    + CONVERT(VARCHAR,[colz].[scale])))
                    + SPACE(7)
                    + SPACE(@ObjectDataTypeLen - LEN(TYPE_NAME([colz].[user_type_id])))
                    + CASE
                        WHEN COLUMNPROPERTY ( @TABLE_ID , [colz].[name] , 'IsIdentity' ) = 0
                        THEN ''
                        ELSE ' IDENTITY('
                               + CONVERT(VARCHAR,ISNULL(IDENT_SEED(@TBLNAME),1) )
                               + ','
                               + CONVERT(VARCHAR,ISNULL(IDENT_INCR(@TBLNAME),1) )
                               + ')'
                        END
                    + CASE  WHEN [colz].[is_sparse] = 1 THEN ' sparse' ELSE '       ' END
                    + CASE
                        WHEN [colz].[is_nullable] = 0
                        THEN ' NOT NULL'
                        ELSE '     NULL'
                      END
-- data types with scale  IE datetime2(7),TIME(7)
               WHEN TYPE_NAME([colz].[user_type_id]) IN ('datetime2','datetimeoffset','time')
               THEN CASE 
                      WHEN [colz].[scale] < 7 THEN
                      '('
                      + CONVERT(VARCHAR,[colz].[scale])
                      + ') '
                    ELSE 
                      '    '
                    END
                    + SPACE(4)
                    + SPACE(@ObjectDataTypeLen - LEN(TYPE_NAME([colz].[user_type_id])))
                    + '        '
                    + CASE  WHEN [colz].[is_sparse] = 1 THEN ' sparse' ELSE '       ' END
                    + CASE [colz].[generated_always_type]
                        WHEN 0 THEN ''
                        WHEN 1 THEN ' GENERATED ALWAYS AS ROW START'
                        WHEN 2 THEN ' GENERATED ALWAYS AS ROW END'
                        ELSE ''
                      END 
                    + CASE WHEN [colz].[is_hidden] = 1 THEN ' HIDDEN' ELSE '' END
                    + CASE
                        WHEN [colz].[is_nullable] = 0
                        THEN ' NOT NULL'
                        ELSE '     NULL'
                      END
--data types with no/precision/scale,IE  FLOAT
               WHEN  TYPE_NAME([colz].[user_type_id]) IN ('float') --,'real')
               THEN
               --addition: if 53, no need to specifically say (53), otherwise display it
                    CASE
                      WHEN [colz].[precision] = 53
                      THEN SPACE(11 - LEN(CONVERT(VARCHAR,[colz].[precision])))
                           + SPACE(7)
                           + SPACE(@ObjectDataTypeLen - LEN(TYPE_NAME([colz].[user_type_id])))
                           + CASE  WHEN [colz].[is_sparse] = 1 THEN ' sparse' ELSE '       ' END
                           + CASE
                               WHEN [colz].[is_nullable] = 0
                               THEN ' NOT NULL'
                               ELSE '     NULL'
                             END
                      ELSE '('
                           + CONVERT(VARCHAR,[colz].[precision])
                           + ') '
                           + SPACE(6 - LEN(CONVERT(VARCHAR,[colz].[precision])))
                           + SPACE(7) + SPACE(@ObjectDataTypeLen - LEN(TYPE_NAME([colz].[user_type_id])))
                           + CASE  WHEN [colz].[is_sparse] = 1 THEN ' sparse' ELSE '       ' END
                           + CASE
                               WHEN [colz].[is_nullable] = 0
                               THEN ' NOT NULL'
                               ELSE '     NULL'
                             END
                      END
--data type with max_length		ie CHAR (44), VARCHAR(40), BINARY(5000),
--##############################################################################
-- COLLATE STATEMENTS
-- personally i do not like collation statements,
-- but included here to make it easy on those who do
--##############################################################################
               WHEN  TYPE_NAME([colz].[user_type_id]) IN ('char','varchar','binary','varbinary')
               THEN CASE
                      WHEN  [colz].[max_length] = -1
                      THEN  '(max)'
                            + SPACE(6 - LEN(CONVERT(VARCHAR,[colz].[max_length])))
                            + SPACE(7) + SPACE(@ObjectDataTypeLen - LEN(TYPE_NAME([colz].[user_type_id])))
                            ----collate to comment out when not desired
                            --+ CASE
                            --    WHEN COLS.collation_name IS NULL
                            --    THEN ''
                            --    ELSE ' COLLATE ' + COLS.collation_name
                            --  END
                            + CASE  WHEN [colz].[is_sparse] = 1 THEN ' sparse' ELSE '       ' END
                            + CASE
                                WHEN [colz].[is_nullable] = 0
                                THEN ' NOT NULL'
                                ELSE '     NULL'
                              END
                      ELSE '('
                           + CONVERT(VARCHAR,[colz].[max_length])
                           + ') '
                           + SPACE(6 - LEN(CONVERT(VARCHAR,[colz].[max_length])))
                           + SPACE(7) + SPACE(@ObjectDataTypeLen - LEN(TYPE_NAME([colz].[user_type_id])))
                           ----collate to comment out when not desired
                           --+ CASE
                           --     WHEN COLS.collation_name IS NULL
                           --     THEN ''
                           --     ELSE ' COLLATE ' + COLS.collation_name
                           --   END
                           + CASE  WHEN [colz].[is_sparse] = 1 THEN ' sparse' ELSE '       ' END
                           + CASE
                               WHEN [colz].[is_nullable] = 0
                               THEN ' NOT NULL'
                               ELSE '     NULL'
                             END
                    END
--data type with max_length ( BUT DOUBLED) ie NCHAR(33), NVARCHAR(40)
               WHEN TYPE_NAME([colz].[user_type_id]) IN ('nchar','nvarchar')
               THEN CASE
                      WHEN  [colz].[max_length] = -1
                      THEN '(max)'
                           + SPACE(5 - LEN(CONVERT(VARCHAR,([colz].[max_length] / 2))))
                           + SPACE(7)
                           + SPACE(@ObjectDataTypeLen - LEN(TYPE_NAME([colz].[user_type_id])))
                           ----collate to comment out when not desired
                           --+ CASE
                           --     WHEN COLS.collation_name IS NULL
                           --     THEN ''
                           --     ELSE ' COLLATE ' + COLS.collation_name
                           --   END
                           + CASE  WHEN [colz].[is_sparse] = 1 THEN ' sparse' ELSE '       ' END
                           + CASE
                               WHEN [colz].[is_nullable] = 0
                               THEN  ' NOT NULL'
                               ELSE '     NULL'
                             END
                      ELSE '('
                           + CONVERT(VARCHAR,([colz].[max_length] / 2))
                           + ') '
                           + SPACE(6 - LEN(CONVERT(VARCHAR,([colz].[max_length] / 2))))
                           + SPACE(7)
                           + SPACE(@ObjectDataTypeLen - LEN(TYPE_NAME([colz].[user_type_id])))
                           ----collate to comment out when not desired
                           --+ CASE
                           --     WHEN COLS.collation_name IS NULL
                           --     THEN ''
                           --     ELSE ' COLLATE ' + COLS.collation_name
                           --   END
                           + CASE  WHEN [colz].[is_sparse] = 1 THEN ' sparse' ELSE '       ' END
                           + CASE
                               WHEN [colz].[is_nullable] = 0
                               THEN ' NOT NULL'
                               ELSE '     NULL'
                             END
                    END
               WHEN TYPE_NAME([colz].[user_type_id]) IN ('datetime','money','text','image','real')
               THEN SPACE(18 - LEN(TYPE_NAME([colz].[user_type_id])))
                    + '              '
                    + CASE  WHEN [colz].[is_sparse] = 1 THEN ' sparse' ELSE '       ' END
                    + CASE
                        WHEN [colz].[is_nullable] = 0
                        THEN ' NOT NULL'
                        ELSE '     NULL'
                      END
--  other data type 	IE INT, DATETIME, MONEY, CUSTOM DATA TYPE,...
               ELSE SPACE(@ObjectDataTypeLen - LEN(TYPE_NAME([colz].[user_type_id])))
                            + CASE
                                WHEN COLUMNPROPERTY ( @TABLE_ID , [colz].[name] , 'IsIdentity' ) = 0
                                THEN '              '
                                ELSE ' IDENTITY('
                                     + CONVERT(VARCHAR,ISNULL(IDENT_SEED(@TBLNAME),1) )
                                     + ','
                                     + CONVERT(VARCHAR,ISNULL(IDENT_INCR(@TBLNAME),1) )
                                     + ')'
                              END
                            + SPACE(2)
                            + CASE  WHEN [colz].[is_sparse] = 1 THEN ' sparse' ELSE '       ' END
                            + CASE
                                WHEN [colz].[is_nullable] = 0
                                THEN ' NOT NULL'
                                ELSE '     NULL'
                              END
               END
             + CASE
                 WHEN [colz].[default_object_id] = 0
                 THEN ''
                 --ELSE ' DEFAULT '  + ISNULL(def.[definition] ,'')
                 --optional section in case NAMED default constraints are needed:
                 ELSE '  CONSTRAINT ' + QUOTENAME([DEF].[name]) + ' DEFAULT ' + ISNULL([DEF].[definition] ,'')
                        --i thought it needed to be handled differently! NOT!
               END  --CASE cdefault
      END --iscomputed
    + ','
    FROM [sys].[columns] AS [colz]
      LEFT OUTER JOIN  [sys].[default_constraints]  AS [DEF]
        ON [colz].[default_object_id] = [DEF].[object_id]
      LEFT OUTER JOIN [sys].[computed_columns] AS [CALC]
         ON  [colz].[object_id] = [CALC].[object_id]
         AND [colz].[column_id] = [CALC].[column_id]
    WHERE [colz].[object_id]=@TABLE_ID
    ORDER BY [colz].[column_id];
--##############################################################################
--used for formatting the rest of the constraints:
--##############################################################################
  SELECT
    @STRINGLEN = MAX(LEN([objz].[name])) + 1
  FROM [sys].[objects] AS [objz];
--##############################################################################
--PK/Unique Constraints and Indexes, using the 2005/08 INCLUDE syntax
--##############################################################################
  DECLARE @Results  TABLE (
                    [SCHEMA_ID]             INT,
                    [SCHEMA_NAME]           VARCHAR(255),
                    [OBJECT_ID]             INT,
                    [OBJECT_NAME]           VARCHAR(255),
                    [index_id]              INT,
                    [index_name]            VARCHAR(255),
                    [ROWS]                  BIGINT,
                    [SizeMB]                DECIMAL(19,3),
                    [IndexDepth]            INT,
                    [TYPE]                  INT,
                    [type_desc]             VARCHAR(30),
                    [fill_factor]           INT,
                    [is_unique]             INT,
                    [is_primary_key]        INT ,
                    [is_unique_constraint]  INT,
                    [index_columns_key]     VARCHAR(MAX),
                    [index_columns_include] VARCHAR(MAX),
                    [has_filter] BIT ,
                    [filter_definition] VARCHAR(MAX),
                    [currentFilegroupName]  VARCHAR(128),
                    [CurrentCompression]    VARCHAR(128));
  INSERT INTO @Results
    SELECT
      [SCH].[schema_id], [SCH].[name] AS [SCHEMA_NAME],
      [objz].[object_id], [objz].[name] AS [OBJECT_NAME],
      [IDX].[index_id], ISNULL([IDX].[name], '---') AS [index_name],
      [partitions].[ROWS], [partitions].[SizeMB], INDEXPROPERTY([objz].[object_id], [IDX].[name], 'IndexDepth') AS [IndexDepth],
      [IDX].[type], [IDX].[type_desc], [IDX].[fill_factor],
      [IDX].[is_unique], [IDX].[is_primary_key], [IDX].[is_unique_constraint],
      ISNULL([Index_Columns].[index_columns_key], '---') AS [index_columns_key],
      ISNULL([Index_Columns].[index_columns_include], '---') AS [index_columns_include],
      [IDX].[has_filter],
      [IDX].[filter_definition],
      [filz].[name],
      ISNULL([p].[data_compression_desc],'')
    FROM [sys].[objects] AS [objz]
      INNER JOIN [sys].[schemas] AS [SCH] ON [objz].[schema_id]=[SCH].[schema_id]
      INNER JOIN [sys].[indexes] AS [IDX] ON [objz].[object_id]=[IDX].[object_id]
      INNER JOIN [sys].[filegroups] AS [filz] ON [IDX].[data_space_id] = [filz].[data_space_id]
      INNER JOIN [sys].[partitions] AS [p]     ON  [IDX].[object_id] =  [p].[object_id]  AND [IDX].[index_id] = [p].[index_id]
      INNER JOIN (
                  SELECT
                    [statz].[object_id], [statz].[index_id], SUM([statz].[row_count]) AS [ROWS],
                    CONVERT(NUMERIC(19,3), CONVERT(NUMERIC(19,3), SUM([statz].[in_row_reserved_page_count]+[statz].[lob_reserved_page_count]+[statz].[row_overflow_reserved_page_count]))/CONVERT(NUMERIC(19,3), 128)) AS [SizeMB]
                  FROM [sys].[dm_db_partition_stats] AS [statz]
                  GROUP BY [statz].[object_id], [statz].[index_id]
                 ) AS [partitions] 
        ON  [IDX].[object_id]=[partitions].[object_id] 
        AND [IDX].[index_id]=[partitions].[index_id]
    CROSS APPLY (
                 SELECT
                   LEFT([Index_Columns].[index_columns_key], LEN([Index_Columns].[index_columns_key])-1) AS [index_columns_key],
                  LEFT([Index_Columns].[index_columns_include], LEN([Index_Columns].[index_columns_include])-1) AS [index_columns_include]
                 FROM
                      (
                       SELECT
                              (
                              SELECT QUOTENAME([colz].[name]) + CASE WHEN [IXCOLS].[is_descending_key] = 0 THEN ' asc' ELSE ' desc' END + ',' + ' '
                               FROM [sys].[index_columns] AS [IXCOLS]
                                 INNER JOIN [sys].[columns] AS [colz]
                                   ON  [IXCOLS].[column_id]   = [colz].[column_id]
                                   AND [IXCOLS].[object_id] = [colz].[object_id]
                               WHERE [IXCOLS].[is_included_column] = 0
                                 AND [IDX].[object_id] = [IXCOLS].[object_id] 
                                 AND [IDX].[index_id] = [IXCOLS].[index_id]
                               ORDER BY [IXCOLS].[key_ordinal]
                               FOR XML PATH('')
                              ) AS [index_columns_key],
                             (
                             SELECT QUOTENAME([colz].[name]) + ',' + ' '
                              FROM [sys].[index_columns] AS [IXCOLS]
                                INNER JOIN [sys].[columns] AS [colz]
                                  ON  [IXCOLS].[column_id]   = [colz].[column_id]
                                  AND [IXCOLS].[object_id] = [colz].[object_id]
                              WHERE [IXCOLS].[is_included_column] = 1
                                AND [IDX].[object_id] = [IXCOLS].[object_id] 
                                AND [IDX].[index_id] = [IXCOLS].[index_id]
                              ORDER BY [IXCOLS].[index_column_id]
                              FOR XML PATH('')
                             ) AS [index_columns_include]
                      ) AS [Index_Columns]
                ) AS [Index_Columns]
    WHERE [SCH].[name]  LIKE CASE 
                                     WHEN @SCHEMANAME = ''   COLLATE SQL_Latin1_General_CP1_CI_AS
                                     THEN [SCH].[name] 
                                     ELSE @SCHEMANAME 
                                   END
    AND [objz].[name] LIKE CASE 
                                  WHEN @TBLNAME = ''   COLLATE SQL_Latin1_General_CP1_CI_AS 
                                  THEN [objz].[name] 
                                  ELSE @TBLNAME 
                                END
    ORDER BY 
      [SCH].[name], 
      [objz].[name], 
      [IDX].[name];
--@Results table has both PK,s Uniques and indexes in thme...pull them out for adding to funal results:
  SET @CONSTRAINTSQLS = '';
  SET @INDEXSQLS      = '';
  SET @TemporalStatement = '';
  SET @WithStatement = '';
--##############################################################################
  -- Temporal tables
--##############################################################################
  SELECT @TemporalStatement =  ISNULL(@vbCrLf + 'PERIOD FOR SYSTEM_TIME ('
  + MAX(CASE WHEN [colz].[generated_always_type] = 1 THEN [colz].[name] ELSE '' END)
  +','
 + MAX(CASE WHEN [colz].[generated_always_type] = 2 THEN [colz].[name] ELSE '' END)
  +'),','') ,
  @WithStatement = ISNULL(' SYSTEM_VERSIONING = ON (HISTORY_TABLE=' + QUOTENAME(OBJECT_SCHEMA_NAME([objz].[history_table_id])) + '.' + QUOTENAME(OBJECT_NAME([objz].[history_table_id])) + '),' ,'')
  FROM [sys].[tables] [objz]
  INNER JOIN [sys].[columns] [colz] 
  ON [objz].[object_id] = [colz].[object_id]
  WHERE [colz].[object_id] = @TABLE_ID 
  AND [colz].[generated_always_type] > 0
  GROUP BY [colz].[object_id],[objz].[history_table_id]
--##############################################################################
-- memory optimized
--##############################################################################
SELECT @WithStatement  = @WithStatement + ISNULL('MEMORY_OPTIMIZED=ON, DURABILITY=' + [objz].[durability_desc] + ',','') 
FROM [sys].[tables] [objz]
WHERE [objz].[is_memory_optimized] =1
AND [objz].[object_id] = @TABLE_ID 
--##############################################################################
--constraints
--column store indexes are different: the "include" columns for normal indexes as scripted above are the columnstores indexed columns
--add a CASE for that situation.
--##############################################################################
  SELECT @CONSTRAINTSQLS = @CONSTRAINTSQLS 
         + CASE
             WHEN [is_primary_key] = 1 OR [is_unique] = 1
             THEN @vbCrLf
                  + 'CONSTRAINT   '  COLLATE SQL_Latin1_General_CP1_CI_AS + QUOTENAME([index_name]) + ' '
                  + CASE  
                      WHEN [is_primary_key] = 1 
                      THEN ' PRIMARY KEY ' 
                      ELSE CASE  
                             WHEN [is_unique] = 1     
                             THEN ' UNIQUE      '      
                             ELSE '' 
                           END 
                    END
                  + [type_desc] 
                  + CASE 
                      WHEN [type_desc]='NONCLUSTERED' 
                      THEN '' 
                      ELSE '   ' 
                    END
                  + ' (' + [index_columns_key] + ')'
                  + CASE 
                      WHEN [index_columns_include] <> '---' 
                      THEN ' INCLUDE (' + [index_columns_include] + ')' 
                      ELSE '' 
                    END
                  + CASE
                      WHEN [has_filter] = 1 
                      THEN ' ' + [filter_definition]
                      ELSE ' '
                    END
                  + CASE WHEN [fill_factor] <> 0 OR [CurrentCompression] <> 'NONE'
                  THEN ' WITH (' + CASE
                                    WHEN [fill_factor] <> 0 
                                    THEN 'FILLFACTOR = ' + CONVERT(VARCHAR(30),[fill_factor]) 
                                    ELSE '' 
                                  END
                                + CASE
                                    WHEN [fill_factor] <> 0  AND [CurrentCompression] <> 'NONE' THEN ',DATA_COMPRESSION = ' + [CurrentCompression] + ' '
                                    WHEN [fill_factor] <> 0  AND [CurrentCompression]  = 'NONE' THEN ''
                                    WHEN [fill_factor]  = 0  AND [CurrentCompression] <> 'NONE' THEN 'DATA_COMPRESSION = ' + [CurrentCompression] + ' '
                                    ELSE '' 
                                  END
                                  + ')'
                  ELSE '' 
                  END 
                      
             ELSE ''
           END + ','
  FROM @Results
  WHERE [type_desc] != 'HEAP'
    AND [is_primary_key] = 1 
    OR  [is_unique] = 1
  ORDER BY 
    [is_primary_key] DESC,
    [is_unique] DESC;
    --
--##############################################################################
--indexes
--##############################################################################
  SELECT @INDEXSQLS = @INDEXSQLS 
         + CASE
             WHEN [is_primary_key] = 0 OR [is_unique] = 0
             THEN @vbCrLf
                  + 'CREATE '  COLLATE SQL_Latin1_General_CP1_CI_AS + [type_desc] + ' INDEX '  COLLATE SQL_Latin1_General_CP1_CI_AS + QUOTENAME([index_name]) + ' '
                  + @vbCrLf
                  + '   ON '   COLLATE SQL_Latin1_General_CP1_CI_AS
                  + QUOTENAME([SCHEMA_NAME]) + '.' + QUOTENAME([OBJECT_NAME])
                  + CASE 
                        WHEN [CurrentCompression] = 'COLUMNSTORE'  COLLATE SQL_Latin1_General_CP1_CI_AS
                        THEN ' (' + [index_columns_include] + ')' 
                        ELSE ' (' + [index_columns_key] + ')'
                    END
                  + CASE 
                      WHEN [CurrentCompression] = 'COLUMNSTORE'  COLLATE SQL_Latin1_General_CP1_CI_AS
                      THEN ''  COLLATE SQL_Latin1_General_CP1_CI_AS
                      ELSE
                        CASE
                     WHEN [index_columns_include] <> '---' 
                     THEN @vbCrLf + '   INCLUDE ('  COLLATE SQL_Latin1_General_CP1_CI_AS + [index_columns_include] + ')'   COLLATE SQL_Latin1_General_CP1_CI_AS
                     ELSE ''   COLLATE SQL_Latin1_General_CP1_CI_AS
                   END
                    END
                  --2008 filtered indexes syntax
                  + CASE 
                      WHEN [has_filter] = 1 
                      THEN @vbCrLf + '   WHERE '  COLLATE SQL_Latin1_General_CP1_CI_AS + [filter_definition]
                      ELSE ''
                    END
                  + CASE WHEN [fill_factor] <> 0 OR [CurrentCompression] <> 'NONE'  COLLATE SQL_Latin1_General_CP1_CI_AS
                  THEN ' WITH ('  COLLATE SQL_Latin1_General_CP1_CI_AS + CASE
                                    WHEN [fill_factor] <> 0 
                                    THEN 'FILLFACTOR = '  COLLATE SQL_Latin1_General_CP1_CI_AS + CONVERT(VARCHAR(30),[fill_factor]) 
                                    ELSE '' 
                                  END
                                + CASE
                                    WHEN [fill_factor] <> 0  AND [CurrentCompression] <> 'NONE' THEN ',DATA_COMPRESSION = ' + [CurrentCompression]+' '
                                    WHEN [fill_factor] <> 0  AND [CurrentCompression]  = 'NONE' THEN ''
                                    WHEN [fill_factor]  = 0  AND [CurrentCompression] <> 'NONE' THEN 'DATA_COMPRESSION = ' + [CurrentCompression]+' '
                                    ELSE '' 
                                  END
                                  + ')'
                  ELSE '' 
                  END 
           END
  FROM @Results
  WHERE [type_desc] != 'HEAP'
    AND [is_primary_key] = 0 
    AND [is_unique] = 0
  ORDER BY 
    [is_primary_key] DESC,
    [is_unique] DESC;
  IF @INDEXSQLS <> ''  COLLATE SQL_Latin1_General_CP1_CI_AS
    SET @INDEXSQLS = @vbCrLf + 'GO'  COLLATE SQL_Latin1_General_CP1_CI_AS + @vbCrLf + @INDEXSQLS;
--##############################################################################
--CHECK Constraints
--##############################################################################
  SET @CHECKCONSTSQLS = ''  COLLATE SQL_Latin1_General_CP1_CI_AS;
  SELECT
    @CHECKCONSTSQLS = @CHECKCONSTSQLS
    + @vbCrLf
    + ISNULL('CONSTRAINT   ' + QUOTENAME([objz].[name]) + ' '
    + SPACE(@STRINGLEN - LEN([objz].[name]))
    + ' CHECK ' + ISNULL([CHECKS].[definition],'')
    + ',','')
  FROM [sys].[objects] AS [objz]
    INNER JOIN [sys].[check_constraints] AS [CHECKS] ON [objz].[object_id] = [CHECKS].[object_id]
  WHERE [objz].[type] = 'C'
    AND [objz].[parent_object_id] = @TABLE_ID;
--##############################################################################
--FOREIGN KEYS
--##############################################################################
  SET @FKSQLS = '' ;
    SELECT
    @FKSQLS=@FKSQLS
    + @vbCrLf + [MyAlias].[Command] FROM
(
SELECT
  DISTINCT
  --FK must be added AFTER the PK/unique constraints are added back.
  850 AS [ExecutionOrder],
  'CONSTRAINT ' 
  + QUOTENAME([conz].[name]) 
  + ' FOREIGN KEY (' 
  + [ChildCollection].[ChildColumns] 
  + ') REFERENCES ' 
  + QUOTENAME(SCHEMA_NAME([conz].[schema_id])) 
  + '.' 
  + QUOTENAME(OBJECT_NAME([conz].[referenced_object_id])) 
  + ' (' + [ParentCollection].[ParentColumns] 
  + ') ' 
  +  CASE [conz].[update_referential_action]
                                        WHEN 0 THEN '' --' ON UPDATE NO ACTION '
                                        WHEN 1 THEN ' ON UPDATE CASCADE '
                                        WHEN 2 THEN ' ON UPDATE SET NULL '
                                        ELSE ' ON UPDATE SET DEFAULT '
                                    END
                  + CASE [conz].[delete_referential_action]
                                        WHEN 0 THEN '' --' ON DELETE NO ACTION '
                                        WHEN 1 THEN ' ON DELETE CASCADE '
                                        WHEN 2 THEN ' ON DELETE SET NULL '
                                        ELSE ' ON DELETE SET DEFAULT '
                                    END
                  + CASE [conz].[is_not_for_replication]
                        WHEN 1 THEN ' NOT FOR REPLICATION '
                        ELSE ''
                    END
  + ',' AS [Command]
FROM   [sys].[foreign_keys] AS [conz]
       INNER JOIN [sys].[foreign_key_columns] AS [colz]
         ON [conz].[object_id] = [colz].[constraint_object_id]
      
       INNER JOIN (--gets my child tables column names   
SELECT
 [conz].[name],
 --technically, FK's can contain up to 16 columns, but real life is often a single column. coding here is for all columns
 [ChildColumns] = STUFF((SELECT 
                         ',' + QUOTENAME([REFZ].[name])
                       FROM   [sys].[foreign_key_columns] AS [fkcolz]
                              INNER JOIN [sys].[columns] AS [REFZ]
                                ON [fkcolz].[parent_object_id] = [REFZ].[object_id]
                                   AND [fkcolz].[parent_column_id] = [REFZ].[column_id]
                       WHERE [fkcolz].[parent_object_id] = [conz].[parent_object_id]
                           AND [fkcolz].[constraint_object_id] = [conz].[object_id]
                         ORDER  BY
                        [fkcolz].[constraint_column_id]
                      FOR XML PATH(''), TYPE).[value]('.','varchar(max)'),1,1,'')
FROM   [sys].[foreign_keys] AS [conz]
      INNER JOIN [sys].[foreign_key_columns] AS [colz]
        ON [conz].[object_id] = [colz].[constraint_object_id]
        WHERE [conz].[parent_object_id]= @TABLE_ID
GROUP  BY
[conz].[name],
[conz].[parent_object_id],--- without GROUP BY multiple rows are returned
 [conz].[object_id]
    ) AS [ChildCollection]
         ON [conz].[name] = [ChildCollection].[name]
       INNER JOIN (--gets the parent tables column names for the FK reference
                  SELECT
                     [conz].[name],
                     [ParentColumns] = STUFF((SELECT
                                              ',' + [REFZ].[name]
                                            FROM   [sys].[foreign_key_columns] AS [fkcolz]
                                                   INNER JOIN [sys].[columns] AS [REFZ]
                                                     ON [fkcolz].[referenced_object_id] = [REFZ].[object_id]
                                                        AND [fkcolz].[referenced_column_id] = [REFZ].[column_id]
                                            WHERE  [fkcolz].[referenced_object_id] = [conz].[referenced_object_id]
                                              AND [fkcolz].[constraint_object_id] = [conz].[object_id]
                                            ORDER BY [fkcolz].[constraint_column_id]
                                            FOR XML PATH(''), TYPE).[value]('.','varchar(max)'),1,1,'')
                   FROM   [sys].[foreign_keys] AS [conz]
                          INNER JOIN [sys].[foreign_key_columns] AS [colz]
                            ON [conz].[object_id] = [colz].[constraint_object_id]
                           -- AND colz.parent_column_id 
                   GROUP  BY
                    [conz].[name],
                    [conz].[referenced_object_id],--- without GROUP BY multiple rows are returned
                    [conz].[object_id]
                  ) AS [ParentCollection]
         ON [conz].[name] = [ParentCollection].[name]
)AS [MyAlias];
--##############################################################################
--RULES
--##############################################################################
  SET @RULESCONSTSQLS = '';
  SELECT
    @RULESCONSTSQLS = @RULESCONSTSQLS
    + ISNULL(
             @vbCrLf
             + 'if not exists(SELECT [name] FROM sys.objects WHERE TYPE=''R'' AND schema_id = ' COLLATE SQL_Latin1_General_CP1_CI_AS + CONVERT(VARCHAR(30),[objz].[schema_id]) + ' AND [name] = '''  COLLATE SQL_Latin1_General_CP1_CI_AS + QUOTENAME(OBJECT_NAME([colz].[rule_object_id])) + ''')'  COLLATE SQL_Latin1_General_CP1_CI_AS + @vbCrLf
             + [MODS].[definition]  + @vbCrLf + 'GO' COLLATE SQL_Latin1_General_CP1_CI_AS +  @vbCrLf
             + 'EXEC sp_binderule  ' + QUOTENAME([objz].[name]) + ', ''' + QUOTENAME(OBJECT_NAME([colz].[object_id])) + '.' + QUOTENAME([colz].[name]) + ''''  COLLATE SQL_Latin1_General_CP1_CI_AS + @vbCrLf + 'GO'  COLLATE SQL_Latin1_General_CP1_CI_AS ,'')
  FROM [sys].[columns] [colz] 
    INNER JOIN [sys].[objects] [objz]
      ON [objz].[object_id] = [colz].[object_id]
    INNER JOIN [sys].[sql_modules] AS [MODS]
      ON [colz].[rule_object_id] = [MODS].[object_id]
  WHERE [colz].[rule_object_id] <> 0
    AND [colz].[object_id] = @TABLE_ID;
--##############################################################################
--TRIGGERS
--##############################################################################
  SET @TRIGGERSTATEMENT = '';
  SELECT
    @TRIGGERSTATEMENT = @TRIGGERSTATEMENT +  @vbCrLf + [MODS].[definition] + @vbCrLf + 'GO'
  FROM [sys].[sql_modules] AS [MODS]
  WHERE [MODS].[object_id] IN(SELECT
                         [objz].[object_id]
                       FROM [sys].[objects] AS [objz]
                       WHERE [objz].[type] = 'TR'
                       AND [objz].[parent_object_id] = @TABLE_ID);
  IF @TRIGGERSTATEMENT <> ''  COLLATE SQL_Latin1_General_CP1_CI_AS
    SET @TRIGGERSTATEMENT = @vbCrLf + 'GO'  COLLATE SQL_Latin1_General_CP1_CI_AS + @vbCrLf + @TRIGGERSTATEMENT;
--##############################################################################
--NEW SECTION QUERY ALL EXTENDED PROPERTIES
--##############################################################################
  SET @EXTENDEDPROPERTIES = '';
  SELECT  @EXTENDEDPROPERTIES =
          @EXTENDEDPROPERTIES + @vbCrLf +
         'EXEC sys.sp_addextendedproperty
          @name = N'''  COLLATE SQL_Latin1_General_CP1_CI_AS + [name] + ''', @value = N'''  COLLATE SQL_Latin1_General_CP1_CI_AS + REPLACE(CONVERT(VARCHAR(MAX),[value]),'''','''''') + ''',
          @level0type = N''SCHEMA'', @level0name = '  COLLATE SQL_Latin1_General_CP1_CI_AS + QUOTENAME(@SCHEMANAME) + ',
          @level1type = N''TABLE'', @level1name = '  COLLATE SQL_Latin1_General_CP1_CI_AS + QUOTENAME(@TBLNAME) + ';'
 --SELECT objtype, objname, name, value
  FROM [sys].[fn_listextendedproperty] (NULL, 'schema', @SCHEMANAME, 'table', @TBLNAME, NULL, NULL);
  --OMacoder suggestion for column extended properties http://www.sqlservercentral.com/Forums/FindPost1651606.aspx
   ;WITH [obj] AS (
	SELECT [split].[a].[value]('.', 'VARCHAR(20)') AS [name]
	FROM ( 
		SELECT CAST ('<M>' + REPLACE('column,constraint,index,trigger,parameter', ',', '</M><M>') + '</M>' AS XML) AS [data] 
		) AS [A] 
		CROSS APPLY [data].[nodes] ('/M') AS [split]([a])
	)
  SELECT 
  @EXTENDEDPROPERTIES =
		 @EXTENDEDPROPERTIES + @vbCrLf + @vbCrLf +
         'EXEC sys.sp_addextendedproperty
         @name = N''' COLLATE SQL_Latin1_General_CP1_CI_AS
         + [lep].[name] 
         + ''', @value = N''' COLLATE SQL_Latin1_General_CP1_CI_AS
         + REPLACE(CONVERT(VARCHAR(MAX),[lep].[value]),'''','''''') + ''',
         @level0type = N''SCHEMA'', @level0name = ' COLLATE SQL_Latin1_General_CP1_CI_AS
         + QUOTENAME(@SCHEMANAME) 
         + ',
         @level1type = N''TABLE'', @level1name = ' COLLATE SQL_Latin1_General_CP1_CI_AS
         + QUOTENAME(@TBLNAME) 
         + ',
         @level2type = N''' COLLATE SQL_Latin1_General_CP1_CI_AS
         + UPPER([obj].[name])  
         + ''', @level2name = ' COLLATE SQL_Latin1_General_CP1_CI_AS
         + QUOTENAME([lep].[objname]) + ';' COLLATE SQL_Latin1_General_CP1_CI_AS
  --SELECT objtype, objname, name, value
  FROM [obj] 
	CROSS APPLY [sys].[fn_listextendedproperty] (NULL, 'schema', @SCHEMANAME, 'table', @TBLNAME, [obj].[name], NULL) AS [lep];  
  
  IF @EXTENDEDPROPERTIES <> '' COLLATE SQL_Latin1_General_CP1_CI_AS
    SET @EXTENDEDPROPERTIES = @vbCrLf + 'GO' COLLATE SQL_Latin1_General_CP1_CI_AS + @vbCrLf + @EXTENDEDPROPERTIES;
--##############################################################################
--FINAL CLEANUP AND PRESENTATION
--##############################################################################
--at this point, there is a trailing comma, or it blank
--WITH statment has a trailing comma

IF @WithStatement > '' 
  SET @WithStatement='WITH (' + SUBSTRING(@WithStatement,1,LEN(@WithStatement) -1)  + ')'
  SELECT
    @FINALSQL = @FINALSQL
                + @TemporalStatement
                + @CONSTRAINTSQLS
                + @CHECKCONSTSQLS
                + @FKSQLS;
--note that this trims the trailing comma from the end of the statements
  SET @FINALSQL = SUBSTRING(@FINALSQL,1,LEN(@FINALSQL) -1) ;
  SET @FINALSQL = @FINALSQL + ')' COLLATE SQL_Latin1_General_CP1_CI_AS +  @vbCrLf + @WithStatement COLLATE SQL_Latin1_General_CP1_CI_AS +  @vbCrLf ;
  SET @input = @vbCrLf
       + @FINALSQL
       + @INDEXSQLS
       + @RULESCONSTSQLS
       + @TRIGGERSTATEMENT
       + @EXTENDEDPROPERTIES;
  SELECT @input AS [Item];
  RETURN 0;     
--##############################################################################
-- END Normal Table Processing
--############################################################################## 
    
--simple, primitive version to get the results of a TEMP table from the TEMP db.  
--##############################################################################
-- NEW Temp Table Logic
--##############################################################################     
TEMPPROCESS:
  SELECT @TABLE_ID = OBJECT_ID('tempdb..' COLLATE SQL_Latin1_General_CP1_CI_AS + @TBLNAME);
--##############################################################################
-- Valid temp Table, Continue Processing
--##############################################################################
SELECT @FINALSQL = 
     CASE 
       WHEN [tabz].[history_table_id] IS NULL 
       THEN '' 
       ELSE 'ALTER TABLE ' + QUOTENAME(OBJECT_SCHEMA_NAME([tabz].[object_id]) ) + '.' + QUOTENAME(OBJECT_NAME([tabz].[object_id])) + ' SET (SYSTEM_VERSIONING = OFF);' + @vbCrLf
            +  'IF OBJECT_ID(''' + QUOTENAME(OBJECT_SCHEMA_NAME([tabz].[history_table_id]) ) + '.' + QUOTENAME(OBJECT_NAME([tabz].[history_table_id])) + ''') IS NOT NULL ' + @vbCrLf
              + 'DROP TABLE ' + QUOTENAME(OBJECT_SCHEMA_NAME([tabz].[history_table_id])) + '.' + QUOTENAME(OBJECT_NAME([tabz].[history_table_id])) + ' ' + @vbCrLf + 'GO' + @vbCrLf
       END
    + 'IF OBJECT_ID(''' + QUOTENAME(OBJECT_SCHEMA_NAME([tabz].[object_id]) ) + '.' + QUOTENAME(OBJECT_NAME([tabz].[object_id])) + ''') IS NOT NULL ' + @vbCrLf
              + 'DROP TABLE ' + QUOTENAME(OBJECT_SCHEMA_NAME([tabz].[object_id])) + '.' + QUOTENAME(OBJECT_NAME([tabz].[object_id])) + ' ' + @vbCrLf + 'GO' + @vbCrLf
              + 'CREATE TABLE ' + QUOTENAME(OBJECT_SCHEMA_NAME([tabz].[object_id])) + '.' + QUOTENAME(OBJECT_NAME([tabz].[object_id])) + ' ( '
FROM [sys].[tables] [tabz] WHERE [tabz].[object_id] = OBJECT_ID(@TABLE_ID)
  --removed invalid code here which potentially selected wrong table--thansk David Grifiths @SSC!
SELECT 
    @STRINGLEN = MAX(LEN([colz].[name])) + 1
  FROM [tempdb].[sys].[objects] AS [objz]
    INNER JOIN [tempdb].[sys].[columns] AS [colz]
      ON  [objz].[object_id] = [colz].[object_id]
      AND [objz].[object_id] = @TABLE_ID;
--##############################################################################
--Get the hash index definitions for memory optimized tables, if any.
--##############################################################################

--##############################################################################
--Get the columns, their definitions and defaults.
--##############################################################################
  SELECT
    @FINALSQL = @FINALSQL
    + CASE
        WHEN [colz].[is_computed] = 1
        THEN @vbCrLf
             + QUOTENAME([colz].[name])
             + ' '
             + SPACE(@STRINGLEN - LEN([colz].[name]))
             + 'AS ' + ISNULL([CALC].[definition],'')
              + CASE 
                 WHEN [CALC].[is_persisted] = 1 
                 THEN ' PERSISTED'
                 ELSE ''
               END
        ELSE @vbCrLf
             + QUOTENAME([colz].[name])
             + ' '
             + SPACE(@STRINGLEN - LEN([colz].[name]))
             + UPPER(TYPE_NAME([colz].[user_type_id]))
             + CASE
-- data types with precision and scale  IE DECIMAL(18,3), NUMERIC(10,2)
               WHEN TYPE_NAME([colz].[user_type_id]) IN ('decimal','numeric')
               THEN '('
                    + CONVERT(VARCHAR,[colz].[precision])
                    + ','
                    + CONVERT(VARCHAR,[colz].[scale])
                    + ') '
                    + SPACE(6 - LEN(CONVERT(VARCHAR,[colz].[precision])
                    + ','
                    + CONVERT(VARCHAR,[colz].[scale])))
                    + SPACE(7)
                    + SPACE(16 - LEN(TYPE_NAME([colz].[user_type_id])))
                    + CASE
                        WHEN [colz].[is_identity] = 1
                        THEN ' IDENTITY(1,1)'
                        ELSE ''
                        ----WHEN COLUMNPROPERTY ( @TABLE_ID , COLS.[name] , 'IsIdentity' ) = 1
                        ----THEN ' IDENTITY('
                        ----       + CONVERT(VARCHAR,ISNULL(IDENT_SEED('tempdb..' + @TBLNAME),1) )
                        ----       + ','
                        ----       + CONVERT(VARCHAR,ISNULL(IDENT_INCR('tempdb..' + @TBLNAME),1) )
                        ----       + ')'
                        ----ELSE ''
                        END
                    + CASE  WHEN [colz].[is_sparse] = 1 THEN ' sparse' ELSE '       ' END
                    + CASE
                        WHEN [colz].[is_nullable] = 0
                        THEN ' NOT NULL'
                        ELSE '     NULL'
                      END
-- data types with scale  IE datetime2(7),TIME(7)
               WHEN TYPE_NAME([colz].[user_type_id]) IN ('datetime2','datetimeoffset','time')
               THEN CASE 
                      WHEN [colz].[scale] < 7 THEN
                      '('
                      + CONVERT(VARCHAR,[colz].[scale])
                      + ') '
                    ELSE 
                      '    '
                    END
                    + SPACE(4)
                    + SPACE(@ObjectDataTypeLen - LEN(TYPE_NAME([colz].[user_type_id])))
                    + '        '
                    + CASE  WHEN [colz].[is_sparse] = 1 THEN ' sparse' ELSE '       ' END
                    + CASE [colz].[generated_always_type]
                        WHEN 0 THEN ''
                        WHEN 1 THEN ' GENERATED ALWAYS AS ROW START'
                        WHEN 2 THEN ' GENERATED ALWAYS AS ROW END'
                        ELSE ''
                      END 
                    + CASE WHEN [colz].[is_hidden] = 1 THEN ' HIDDEN' ELSE '' END
                    + CASE
                        WHEN [colz].[is_nullable] = 0
                        THEN ' NOT NULL'
                        ELSE '     NULL'
                      END
--data types with no/precision/scale,IE  FLOAT
               WHEN  TYPE_NAME([colz].[user_type_id]) IN ('float') --,'real')
               THEN
               --addition: if 53, no need to specifically say (53), otherwise display it
                    CASE
                      WHEN [colz].[precision] = 53
                      THEN SPACE(11 - LEN(CONVERT(VARCHAR,[colz].[precision])))
                           + SPACE(7)
                           + SPACE(@ObjectDataTypeLen - LEN(TYPE_NAME([colz].[user_type_id])))
                           + CASE  WHEN [colz].[is_sparse] = 1 THEN ' sparse' ELSE '       ' END
                           + CASE
                               WHEN [colz].[is_nullable] = 0
                               THEN ' NOT NULL'
                               ELSE '     NULL'
                             END
                      ELSE '('
                           + CONVERT(VARCHAR,[colz].[precision])
                           + ') '
                           + SPACE(6 - LEN(CONVERT(VARCHAR,[colz].[precision])))
                           + SPACE(7) + SPACE(@ObjectDataTypeLen - LEN(TYPE_NAME([colz].[user_type_id])))
                           + CASE  WHEN [colz].[is_sparse] = 1 THEN ' sparse' ELSE '       ' END
                           + CASE
                               WHEN [colz].[is_nullable] = 0
                               THEN ' NOT NULL'
                               ELSE '     NULL'
                             END
                      END
--ie VARCHAR(40)
--##############################################################################
-- COLLATE STATEMENTS in tempdb!
-- personally i do not like collation statements,
-- but included here to make it easy on those who do
--##############################################################################
               WHEN  TYPE_NAME([colz].[user_type_id]) IN ('char','varchar','binary','varbinary')
               THEN CASE
                      WHEN  [colz].[max_length] = -1
                      THEN  '(max)'
                            + SPACE(6 - LEN(CONVERT(VARCHAR,[colz].[max_length])))
                            + SPACE(7) + SPACE(@ObjectDataTypeLen - LEN(TYPE_NAME([colz].[user_type_id])))
                            ----collate to comment out when not desired
                            --+ CASE
                            --    WHEN COLS.collation_name IS NULL
                            --    THEN ''
                            --    ELSE ' COLLATE ' + COLS.collation_name
                            --  END
                            + CASE  WHEN [colz].[is_sparse] = 1 THEN ' sparse' ELSE '       ' END
                            + CASE
                                WHEN [colz].[is_nullable] = 0
                                THEN ' NOT NULL'
                                ELSE '     NULL'
                              END
                      ELSE '('
                           + CONVERT(VARCHAR,[colz].[max_length])
                           + ') '
                           + SPACE(6 - LEN(CONVERT(VARCHAR,[colz].[max_length])))
                           + SPACE(7) + SPACE(@ObjectDataTypeLen - LEN(TYPE_NAME([colz].[user_type_id])))
                           ----collate to comment out when not desired
                           --+ CASE
                           --     WHEN COLS.collation_name IS NULL
                           --     THEN ''
                           --     ELSE ' COLLATE ' + COLS.collation_name
                           --   END
                           + CASE  WHEN [colz].[is_sparse] = 1 THEN ' sparse' ELSE '       ' END
                           + CASE
                               WHEN [colz].[is_nullable] = 0
                               THEN ' NOT NULL'
                               ELSE '     NULL'
                             END
                    END
--data type with max_length ( BUT DOUBLED) ie NCHAR(33), NVARCHAR(40)
               WHEN TYPE_NAME([colz].[user_type_id]) IN ('nchar','nvarchar')
               THEN CASE
                      WHEN  [colz].[max_length] = -1
                      THEN '(max)'
                           + SPACE(5 - LEN(CONVERT(VARCHAR,([colz].[max_length] / 2))))
                           + SPACE(7)
                           + SPACE(@ObjectDataTypeLen - LEN(TYPE_NAME([colz].[user_type_id])))
                           -- --collate to comment out when not desired
                           --+ CASE
                           --     WHEN COLS.collation_name IS NULL
                           --     THEN ''
                           --     ELSE ' COLLATE ' + COLS.collation_name
                           --   END
                           + CASE  WHEN [colz].[is_sparse] = 1 THEN ' sparse' ELSE '       ' END
                           + CASE
                               WHEN [colz].[is_nullable] = 0
                               THEN  ' NOT NULL'
                               ELSE '     NULL'
                             END
                      ELSE '('
                           + CONVERT(VARCHAR,([colz].[max_length] / 2))
                           + ') '
                           + SPACE(6 - LEN(CONVERT(VARCHAR,([colz].[max_length] / 2))))
                           + SPACE(7)
                           + SPACE(@ObjectDataTypeLen - LEN(TYPE_NAME([colz].[user_type_id])))
                           -- --collate to comment out when not desired
                           --+ CASE
                           --     WHEN COLS.collation_name IS NULL
                           --     THEN ''
                           --     ELSE ' COLLATE ' + COLS.collation_name
                           --   END
                           + CASE  WHEN [colz].[is_sparse] = 1 THEN ' sparse' ELSE '       ' END
                           + CASE
                               WHEN [colz].[is_nullable] = 0
                               THEN ' NOT NULL'
                               ELSE '     NULL'
                             END
                    END
--  other data type 	IE INT, DATETIME, MONEY, CUSTOM DATA TYPE,...
               WHEN TYPE_NAME([colz].[user_type_id]) IN ('datetime','money','text','image','real')
               THEN SPACE(18 - LEN(TYPE_NAME([colz].[user_type_id])))
                    + '              '
                    + CASE  WHEN [colz].[is_sparse] = 1 THEN ' sparse' ELSE '       ' END
                    + CASE
                        WHEN [colz].[is_nullable] = 0
                        THEN ' NOT NULL'
                        ELSE '     NULL'
                      END
--IE INT
               ELSE SPACE(@ObjectDataTypeLen - LEN(TYPE_NAME([colz].[user_type_id])))
                            + CASE
                                WHEN [colz].[is_identity] = 1
                                THEN ' IDENTITY(1,1)'
                                ELSE '              '
                                ----WHEN COLUMNPROPERTY ( @TABLE_ID , COLS.[name] , 'IsIdentity' ) = 1
                                ----THEN ' IDENTITY('
                                ----     + CONVERT(VARCHAR,ISNULL(IDENT_SEED('tempdb..' + @TBLNAME),1) )
                                ----     + ','
                                ----     + CONVERT(VARCHAR,ISNULL(IDENT_INCR('tempdb..' + @TBLNAME),1) )
                                ----     + ')'
                                ----ELSE '              '
                              END
                            + SPACE(2)
                            + CASE  WHEN [colz].[is_sparse] = 1 THEN ' sparse' ELSE '       ' END
                            + CASE
                                WHEN [colz].[is_nullable] = 0
                                THEN ' NOT NULL'
                                ELSE '     NULL'
                              END
               END
             + CASE
                 WHEN [colz].[default_object_id] = 0
                 THEN ''
                 ELSE ' DEFAULT '  + ISNULL([DEF].[definition] ,'')
                 --optional section in case NAMED default cosntraints are needed:
                 --ELSE ' CONSTRAINT [' + DEF.name + '] DEFAULT '+ REPLACE(REPLACE(ISNULL(DEF.[definition] ,''),'((','('),'))',')')
                        --i thought it needed to be handled differently! NOT!
               END  --CASE cdefault
      END --iscomputed
    + ','
    FROM [tempdb].[sys].[columns] AS [colz]
      LEFT OUTER JOIN  [tempdb].[sys].[default_constraints]  AS [DEF]
        ON [colz].[default_object_id] = [DEF].[object_id]
      LEFT OUTER JOIN [tempdb].[sys].[computed_columns] AS [CALC]
         ON  [colz].[object_id] = [CALC].[object_id]
         AND [colz].[column_id] = [CALC].[column_id]
    WHERE [colz].[object_id]=@TABLE_ID
    ORDER BY [colz].[column_id];
--##############################################################################
--used for formatting the rest of the constraints:
--##############################################################################
  SELECT
    @STRINGLEN = MAX(LEN([objz].[name])) + 1
  FROM [tempdb].[sys].[objects] AS [objz];
--##############################################################################
--PK/Unique Constraints and Indexes, using the 2005/08 INCLUDE syntax
--##############################################################################
  DECLARE @Results2  TABLE (
                    [SCHEMA_ID]             INT,
                    [SCHEMA_NAME]           VARCHAR(255),
                    [OBJECT_ID]             INT,
                    [OBJECT_NAME]           VARCHAR(255),
                    [index_id]              INT,
                    [index_name]            VARCHAR(255),
                    [ROWS]                  BIGINT,
                    [SizeMB]                DECIMAL(19,3),
                    [IndexDepth]            INT,
                    [TYPE]                  INT,
                    [type_desc]             VARCHAR(30),
                    [fill_factor]           INT,
                    [is_unique]             INT,
                    [is_primary_key]        INT ,
                    [is_unique_constraint]  INT,
                    [index_columns_key]     VARCHAR(MAX),
                    [index_columns_include] VARCHAR(MAX),
                    [has_filter] BIT ,
                    [filter_definition] VARCHAR(MAX),
                    [currentFilegroupName]  VARCHAR(128),
                    [CurrentCompression]    VARCHAR(128));
  INSERT INTO @Results2
    SELECT
      [SCH].[schema_id], [SCH].[name] AS [SCHEMA_NAME],
      [objz].[object_id], [objz].[name] AS [OBJECT_NAME],
      [IDX].[index_id], ISNULL([IDX].[name], '---') AS [index_name],
      [partitions].[ROWS], [partitions].[SizeMB], INDEXPROPERTY([objz].[object_id], [IDX].[name], 'IndexDepth') AS [IndexDepth],
      [IDX].[type], [IDX].[type_desc], [IDX].[fill_factor],
      [IDX].[is_unique], [IDX].[is_primary_key], [IDX].[is_unique_constraint],
      ISNULL([Index_Columns].[index_columns_key], '---') AS [index_columns_key],
      ISNULL([Index_Columns].[index_columns_include], '---') AS [index_columns_include],
      [IDX].[has_filter],
      [IDX].[filter_definition],
      [filz].[name],
      ISNULL([p].[data_compression_desc],'')
    FROM [tempdb].[sys].[objects] AS [objz]
      INNER JOIN [tempdb].[sys].[schemas] AS [SCH] ON [objz].[schema_id]=[SCH].[schema_id]
      INNER JOIN [tempdb].[sys].[indexes] AS [IDX] ON [objz].[object_id]=[IDX].[object_id]
      INNER JOIN [sys].[filegroups] AS [filz] ON [IDX].[data_space_id] = [filz].[data_space_id]
      INNER JOIN [sys].[partitions] AS [p]     ON  [IDX].[object_id] =  [p].[object_id]  AND [IDX].[index_id] = [p].[index_id]
      INNER JOIN (
                  SELECT
                    [statz].[object_id], [statz].[index_id], SUM([statz].[row_count]) AS [ROWS],
                    CONVERT(NUMERIC(19,3), CONVERT(NUMERIC(19,3), SUM([statz].[in_row_reserved_page_count]+[statz].[lob_reserved_page_count]+[statz].[row_overflow_reserved_page_count]))/CONVERT(NUMERIC(19,3), 128)) AS [SizeMB]
                  FROM [tempdb].[sys].[dm_db_partition_stats] AS [statz]
                  GROUP BY [statz].[object_id], [statz].[index_id]
                 ) AS [partitions] 
        ON  [IDX].[object_id]=[partitions].[object_id] 
        AND [IDX].[index_id]=[partitions].[index_id]
    CROSS APPLY (
                 SELECT
                   LEFT([Index_Columns].[index_columns_key], LEN([Index_Columns].[index_columns_key])-1) AS [index_columns_key],
                  LEFT([Index_Columns].[index_columns_include], LEN([Index_Columns].[index_columns_include])-1) AS [index_columns_include]
                 FROM
                      (
                       SELECT
                              (
                              SELECT QUOTENAME([colz].[name]) + CASE WHEN [IXCOLS].[is_descending_key] = 0 THEN ' asc' ELSE ' desc' END + ',' + ' '
                               FROM [tempdb].[sys].[index_columns] AS [IXCOLS]
                                 INNER JOIN [tempdb].[sys].[columns] AS [colz]
                                   ON  [IXCOLS].[column_id]   = [colz].[column_id]
                                   AND [IXCOLS].[object_id] = [colz].[object_id]
                               WHERE [IXCOLS].[is_included_column] = 0
                                 AND [IDX].[object_id] = [IXCOLS].[object_id] 
                                 AND [IDX].[index_id] = [IXCOLS].[index_id]
                               ORDER BY [IXCOLS].[key_ordinal]
                               FOR XML PATH('')
                              ) AS [index_columns_key],
                             (
                             SELECT QUOTENAME([colz].[name]) + ',' + ' '
                              FROM [tempdb].[sys].[index_columns] AS [IXCOLS]
                                INNER JOIN [tempdb].[sys].[columns] AS [colz]
                                  ON  [IXCOLS].[column_id]   = [colz].[column_id]
                                  AND [IXCOLS].[object_id] = [colz].[object_id]
                              WHERE [IXCOLS].[is_included_column] = 1
                                AND [IDX].[object_id] = [IXCOLS].[object_id] 
                                AND [IDX].[index_id] = [IXCOLS].[index_id]
                              ORDER BY [IXCOLS].[index_column_id]
                              FOR XML PATH('')
                             ) AS [index_columns_include]
                      ) AS [Index_Columns]
                ) AS [Index_Columns]
    WHERE [SCH].[name]  LIKE CASE 
                                     WHEN @SCHEMANAME = '' COLLATE SQL_Latin1_General_CP1_CI_AS
                                     THEN [SCH].[name] 
                                     ELSE @SCHEMANAME 
                                   END
    AND [objz].[name] LIKE CASE 
                                  WHEN @TBLNAME = ''  COLLATE SQL_Latin1_General_CP1_CI_AS
                                  THEN [objz].[name] 
                                  ELSE @TBLNAME 
                                END
    ORDER BY 
      [SCH].[name], 
      [objz].[name], 
      [IDX].[name];
--@Results2 table has both PK,s Uniques and indexes in thme...pull them out for adding to funal results:
  SET @CONSTRAINTSQLS = '' COLLATE SQL_Latin1_General_CP1_CI_AS;
  SET @INDEXSQLS      = '' COLLATE SQL_Latin1_General_CP1_CI_AS;
--##############################################################################
--constraints
--##############################################################################
  SELECT @CONSTRAINTSQLS = @CONSTRAINTSQLS 
         + CASE
             WHEN [is_primary_key] = 1 OR [is_unique] = 1
             THEN @vbCrLf
                  + 'CONSTRAINT   '  COLLATE SQL_Latin1_General_CP1_CI_AS + QUOTENAME([index_name]) + ' '
                  + SPACE(@STRINGLEN - LEN([index_name]))
                  + CASE  
                      WHEN [is_primary_key] = 1 
                      THEN ' PRIMARY KEY '  COLLATE SQL_Latin1_General_CP1_CI_AS
                      ELSE CASE  
                             WHEN [is_unique] = 1     
                             THEN ' UNIQUE      '     COLLATE SQL_Latin1_General_CP1_CI_AS  
                             ELSE ''  COLLATE SQL_Latin1_General_CP1_CI_AS
                           END 
                    END
                  + [type_desc] 
                  + CASE 
                      WHEN [type_desc]='NONCLUSTERED' 
                      THEN ''  COLLATE SQL_Latin1_General_CP1_CI_AS
                      ELSE '   ' 
                    END
                  + ' (' + [index_columns_key] + ')'
                  + CASE 
                      WHEN [index_columns_include] <> '---' 
                      THEN ' INCLUDE (' + [index_columns_include] + ')' 
                      ELSE ''  COLLATE SQL_Latin1_General_CP1_CI_AS
                    END
                  + CASE
                      WHEN [has_filter] = 1 
                      THEN ' ' + [filter_definition]
                      ELSE ' '
                    END
                  + CASE WHEN [fill_factor] <> 0 OR [CurrentCompression] <> 'NONE'
                  THEN ' WITH (' + CASE
                                    WHEN [fill_factor] <> 0 
                                    THEN 'FILLFACTOR = ' + CONVERT(VARCHAR(30),[fill_factor]) 
                                    ELSE ''  COLLATE SQL_Latin1_General_CP1_CI_AS
                                  END
                                + CASE
                                    WHEN [fill_factor] <> 0  AND [CurrentCompression] <> 'NONE' THEN ',DATA_COMPRESSION = ' + [CurrentCompression] + ' '
                                    WHEN [fill_factor] <> 0  AND [CurrentCompression]  = 'NONE' THEN ''
                                    WHEN [fill_factor]  = 0  AND [CurrentCompression] <> 'NONE' THEN 'DATA_COMPRESSION = ' + [CurrentCompression] + ' '
                                    ELSE ''  COLLATE SQL_Latin1_General_CP1_CI_AS
                                  END
                                  + ')'
                  ELSE ''  COLLATE SQL_Latin1_General_CP1_CI_AS
                  END 
             ELSE '' COLLATE SQL_Latin1_General_CP1_CI_AS
           END + ','
  FROM @Results2
  WHERE [type_desc] != 'HEAP'
    AND [is_primary_key] = 1 
    OR  [is_unique] = 1
  ORDER BY 
    [is_primary_key] DESC,
    [is_unique] DESC;
--##############################################################################
--indexes
--##############################################################################
  SELECT @INDEXSQLS = @INDEXSQLS 
         + CASE
             WHEN [is_primary_key] = 0 OR [is_unique] = 0
             THEN @vbCrLf
                  + 'CREATE '  COLLATE SQL_Latin1_General_CP1_CI_AS + [type_desc] + ' INDEX '  COLLATE SQL_Latin1_General_CP1_CI_AS + QUOTENAME([index_name]) + ' ' COLLATE SQL_Latin1_General_CP1_CI_AS
                  + @vbCrLf
                  + '   ON '  COLLATE SQL_Latin1_General_CP1_CI_AS
                  + QUOTENAME([SCHEMA_NAME]) + '.' + QUOTENAME([OBJECT_NAME])
                  + CASE 
                        WHEN [CurrentCompression] = 'COLUMNSTORE'  COLLATE SQL_Latin1_General_CP1_CI_AS
                        THEN ' ('  COLLATE SQL_Latin1_General_CP1_CI_AS+ [index_columns_include] + ')'  COLLATE SQL_Latin1_General_CP1_CI_AS
                        ELSE ' ('  COLLATE SQL_Latin1_General_CP1_CI_AS+ [index_columns_key] + ')' COLLATE SQL_Latin1_General_CP1_CI_AS
                    END
                  + CASE 
                      WHEN [CurrentCompression] = 'COLUMNSTORE'  COLLATE SQL_Latin1_General_CP1_CI_AS
                      THEN ''  COLLATE SQL_Latin1_General_CP1_CI_AS
                      ELSE
                        CASE
                     WHEN [index_columns_include] <> '---' 
                     THEN @vbCrLf + '   INCLUDE ('  COLLATE SQL_Latin1_General_CP1_CI_AS + [index_columns_include] + ')'  COLLATE SQL_Latin1_General_CP1_CI_AS 
                     ELSE ''   COLLATE SQL_Latin1_General_CP1_CI_AS
                   END
                    END
                  --2008 filtered indexes syntax
                  + CASE 
                      WHEN [has_filter] = 1 
                      THEN @vbCrLf + '   WHERE '  COLLATE SQL_Latin1_General_CP1_CI_AS + [filter_definition]
                      ELSE ''  COLLATE SQL_Latin1_General_CP1_CI_AS
                    END
                  + CASE WHEN [fill_factor] <> 0 OR [CurrentCompression] <> 'NONE'  COLLATE SQL_Latin1_General_CP1_CI_AS
                  THEN ' WITH ('  COLLATE SQL_Latin1_General_CP1_CI_AS + CASE
                                    WHEN [fill_factor] <> 0 
                                    THEN 'FILLFACTOR = '  COLLATE SQL_Latin1_General_CP1_CI_AS + CONVERT(VARCHAR(30),[fill_factor]) 
                                    ELSE ''  COLLATE SQL_Latin1_General_CP1_CI_AS
                                  END
                                + CASE
                                    WHEN [fill_factor] <> 0  AND [CurrentCompression] <> 'NONE'  COLLATE SQL_Latin1_General_CP1_CI_AS THEN ',DATA_COMPRESSION = ' COLLATE SQL_Latin1_General_CP1_CI_AS + [CurrentCompression] + ' '
                                    WHEN [fill_factor] <> 0  AND [CurrentCompression]  = 'NONE'  COLLATE SQL_Latin1_General_CP1_CI_AS THEN ''  COLLATE SQL_Latin1_General_CP1_CI_AS
                                    WHEN [fill_factor]  = 0  AND [CurrentCompression] <> 'NONE'  COLLATE SQL_Latin1_General_CP1_CI_AS THEN 'DATA_COMPRESSION = '  COLLATE SQL_Latin1_General_CP1_CI_AS+ [CurrentCompression] + ' '
                                    ELSE ''  COLLATE SQL_Latin1_General_CP1_CI_AS
                                  END
                                  + ')' COLLATE SQL_Latin1_General_CP1_CI_AS
                  ELSE ''  COLLATE SQL_Latin1_General_CP1_CI_AS
                  END 
           END
  FROM @Results2
  WHERE [type_desc] != 'HEAP'
    AND [is_primary_key] = 0 
    AND [is_unique] = 0
  ORDER BY 
    [is_primary_key] DESC,
    [is_unique] DESC;
  IF @INDEXSQLS <> '' COLLATE SQL_Latin1_General_CP1_CI_AS
    SET @INDEXSQLS = @vbCrLf + 'GO'  COLLATE SQL_Latin1_General_CP1_CI_AS+ @vbCrLf + @INDEXSQLS;
--##############################################################################
--CHECK Constraints
--##############################################################################
  SET @CHECKCONSTSQLS = '';
  SELECT
    @CHECKCONSTSQLS = @CHECKCONSTSQLS
    + @vbCrLf
    + ISNULL('CONSTRAINT   ' + QUOTENAME([objz].[name]) + ' '
    + SPACE(@STRINGLEN - LEN([objz].[name]))
    + ' CHECK ' + ISNULL([CHECKS].[definition],'')
    + ',','')
  FROM [tempdb].[sys].[objects] AS [objz]
    INNER JOIN [tempdb].[sys].[check_constraints] AS [CHECKS] ON [objz].[object_id] = [CHECKS].[object_id]
  WHERE [objz].[type] = 'C'
    AND [objz].[parent_object_id] = @TABLE_ID;
--##############################################################################
--FOREIGN KEYS
--##############################################################################
  SET @FKSQLS = '' ;
    SELECT
    @FKSQLS=@FKSQLS
    + @vbCrLf + [MyAlias].[Command] FROM
(
SELECT
  DISTINCT
  --FK must be added AFTER the PK/unique constraints are added back.
  850 AS [ExecutionOrder],
  'CONSTRAINT ' 
  + QUOTENAME([conz].[name]) 
  + ' FOREIGN KEY (' 
  + [ChildCollection].[ChildColumns] 
  + ') REFERENCES ' 
  + QUOTENAME(SCHEMA_NAME([conz].[schema_id])) 
  + '.' 
  + QUOTENAME(OBJECT_NAME([conz].[referenced_object_id])) 
  + ' (' + [ParentCollection].[ParentColumns] 
  + ') ' 
   +  CASE [conz].[update_referential_action]
                                        WHEN 0 THEN '' --' ON UPDATE NO ACTION '
                                        WHEN 1 THEN ' ON UPDATE CASCADE '
                                        WHEN 2 THEN ' ON UPDATE SET NULL '
                                        ELSE ' ON UPDATE SET DEFAULT '
                                    END
                  + CASE [conz].[delete_referential_action]
                                        WHEN 0 THEN '' --' ON DELETE NO ACTION '
                                        WHEN 1 THEN ' ON DELETE CASCADE '
                                        WHEN 2 THEN ' ON DELETE SET NULL '
                                        ELSE ' ON DELETE SET DEFAULT '
                                    END
                  + CASE [conz].[is_not_for_replication]
                        WHEN 1 THEN ' NOT FOR REPLICATION '
                        ELSE ''
                    END
  + ',' AS [Command]
FROM   [sys].[foreign_keys] AS [conz]
       INNER JOIN [sys].[foreign_key_columns] AS [colz]
         ON [conz].[object_id] = [colz].[constraint_object_id]
      
       INNER JOIN (--gets my child tables column names   
SELECT
 [conz].[name],
 --technically, FK's can contain up to 16 columns, but real life is often a single column. coding here is for all columns
 [ChildColumns] = STUFF((SELECT 
                         ',' + QUOTENAME([REFZ].[name])
                       FROM   [sys].[foreign_key_columns] AS [fkcolz]
                              INNER JOIN [sys].[columns] AS [REFZ]
                                ON [fkcolz].[parent_object_id] = [REFZ].[object_id]
                                   AND [fkcolz].[parent_column_id] = [REFZ].[column_id]
                       WHERE [fkcolz].[parent_object_id] = [conz].[parent_object_id]
                           AND [fkcolz].[constraint_object_id] = [conz].[object_id]
                         ORDER  BY
                        [fkcolz].[constraint_column_id]
                       FOR XML PATH(''), TYPE).[value]('.','varchar(max)'),1,1,'')
FROM   [sys].[foreign_keys] AS [conz]
      INNER JOIN [sys].[foreign_key_columns] AS [colz]
        ON [conz].[object_id] = [colz].[constraint_object_id]
 WHERE [conz].[parent_object_id]= @TABLE_ID
GROUP  BY
[conz].[name],
[conz].[parent_object_id],--- without GROUP BY multiple rows are returned
 [conz].[object_id]
    ) AS [ChildCollection]
         ON [conz].[name] = [ChildCollection].[name]
       INNER JOIN (--gets the parent tables column names for the FK reference
                  SELECT
                     [conz].[name],
                     [ParentColumns] = STUFF((SELECT
                                              ',' + [REFZ].[name]
                                            FROM   [sys].[foreign_key_columns] AS [fkcolz]
                                                   INNER JOIN [sys].[columns] AS [REFZ]
                                                     ON [fkcolz].[referenced_object_id] = [REFZ].[object_id]
                                                        AND [fkcolz].[referenced_column_id] = [REFZ].[column_id]
                                            WHERE  [fkcolz].[referenced_object_id] = [conz].[referenced_object_id]
                                              AND [fkcolz].[constraint_object_id] = [conz].[object_id]
                                            ORDER BY [fkcolz].[constraint_column_id]
                                            FOR XML PATH(''), TYPE).[value]('.','varchar(max)'),1,1,'')
                   FROM   [sys].[foreign_keys] AS [conz]
                          INNER JOIN [sys].[foreign_key_columns] AS [colz]
                            ON [conz].[object_id] = [colz].[constraint_object_id]
                           -- AND colz.parent_column_id 
                   GROUP  BY
                    [conz].[name],
                    [conz].[referenced_object_id],--- without GROUP BY multiple rows are returned
                    [conz].[object_id]
                  ) AS [ParentCollection]
         ON [conz].[name] = [ParentCollection].[name]
)AS [MyAlias];
--##############################################################################
--RULES
--##############################################################################
  SET @RULESCONSTSQLS = ''  COLLATE SQL_Latin1_General_CP1_CI_AS;
  SELECT
    @RULESCONSTSQLS = @RULESCONSTSQLS
    + ISNULL(
             @vbCrLf
             + 'if not exists(SELECT [name] FROM tempdb.sys.objects WHERE TYPE=''R'' AND schema_id = '  COLLATE SQL_Latin1_General_CP1_CI_AS 
             + CONVERT(VARCHAR(30),[objz].[schema_id]) 
             + ' AND [name] = '''  COLLATE SQL_Latin1_General_CP1_CI_AS
             + QUOTENAME(OBJECT_NAME([colz].[rule_object_id])) 
             + ''')'  COLLATE SQL_Latin1_General_CP1_CI_AS
             + @vbCrLf
             + [MODS].[definition]  + @vbCrLf 
             + 'GO'  COLLATE SQL_Latin1_General_CP1_CI_AS +  @vbCrLf
             + 'EXEC sp_binderule  '  COLLATE SQL_Latin1_General_CP1_CI_AS
             + QUOTENAME([objz].[name]) 
             + ', '''  COLLATE SQL_Latin1_General_CP1_CI_AS 
             + QUOTENAME(OBJECT_NAME([colz].[object_id])) 
             + '.'  COLLATE SQL_Latin1_General_CP1_CI_AS + QUOTENAME([colz].[name]) 
             + ''''  COLLATE SQL_Latin1_General_CP1_CI_AS
             + @vbCrLf 
             + 'GO' ,''  COLLATE SQL_Latin1_General_CP1_CI_AS)
  FROM [tempdb].[sys].[columns] [colz] 
    INNER JOIN [tempdb].[sys].[objects] [objz]
      ON [objz].[object_id] = [colz].[object_id]
    INNER JOIN [tempdb].[sys].[sql_modules] AS [MODS]
      ON [colz].[rule_object_id] = [MODS].[object_id]
  WHERE [colz].[rule_object_id] <> 0
    AND [colz].[object_id] = @TABLE_ID;
--##############################################################################
--TRIGGERS
--##############################################################################
  SET @TRIGGERSTATEMENT = '';
  SELECT
    @TRIGGERSTATEMENT = @TRIGGERSTATEMENT +  @vbCrLf + [MODS].[definition] + @vbCrLf + 'GO'
  FROM [tempdb].[sys].[sql_modules] AS [MODS]
  WHERE [MODS].[object_id] IN(SELECT
                         [objz].[object_id]
                       FROM [tempdb].[sys].[objects] AS [objz]
                       WHERE [objz].[type] = 'TR'
                       AND [objz].[parent_object_id] = @TABLE_ID);
  IF @TRIGGERSTATEMENT <> ''  COLLATE SQL_Latin1_General_CP1_CI_AS
    SET @TRIGGERSTATEMENT = @vbCrLf + 'GO'  COLLATE SQL_Latin1_General_CP1_CI_AS + @vbCrLf + @TRIGGERSTATEMENT;
--##############################################################################
--NEW SECTION QUERY ALL EXTENDED PROPERTIES
--##############################################################################
  SET @EXTENDEDPROPERTIES = ''  COLLATE SQL_Latin1_General_CP1_CI_AS;
  SELECT  @EXTENDEDPROPERTIES =
          @EXTENDEDPROPERTIES + @vbCrLf +
         'EXEC tempdb.sys.sp_addextendedproperty
          @name = N'''  COLLATE SQL_Latin1_General_CP1_CI_AS
          + [name] 
          + ''', @value = N'''  COLLATE SQL_Latin1_General_CP1_CI_AS
          + REPLACE(CONVERT(VARCHAR(MAX),[value]),'''','''''') + ''',
          @level0type = N''SCHEMA'', @level0name = '  COLLATE SQL_Latin1_General_CP1_CI_AS
          + QUOTENAME(@SCHEMANAME + ',
          @level1type = N''TABLE'', @level1name = ['  COLLATE SQL_Latin1_General_CP1_CI_AS
          + @TBLNAME) 
          + '];' COLLATE SQL_Latin1_General_CP1_CI_AS
 --SELECT objtype, objname, name, value
  FROM [sys].[fn_listextendedproperty] (NULL, 'schema', @SCHEMANAME, 'table', @TBLNAME, NULL, NULL);
  --OMacoder suggestion for column extended properties http://www.sqlservercentral.com/Forums/FindPost1651606.aspx
  SELECT @EXTENDEDPROPERTIES =
         @EXTENDEDPROPERTIES + @vbCrLf +
         'EXEC sys.sp_addextendedproperty
         @name = N'''  COLLATE SQL_Latin1_General_CP1_CI_AS
         + [name] 
         + ''', @value = N'''  COLLATE SQL_Latin1_General_CP1_CI_AS
         + REPLACE(CONVERT(VARCHAR(MAX),[value]),'''','''''') 
         + ''',
         @level0type = N''SCHEMA'', @level0name = '  COLLATE SQL_Latin1_General_CP1_CI_AS
         + QUOTENAME(@SCHEMANAME) + ',
         @level1type = N''TABLE'', @level1name = '  COLLATE SQL_Latin1_General_CP1_CI_AS
         + QUOTENAME(@TBLNAME) + ',
         @level2type = N''COLUMN'', @level2name = '  COLLATE SQL_Latin1_General_CP1_CI_AS
         + QUOTENAME([objname]) + ';' COLLATE SQL_Latin1_General_CP1_CI_AS
  --SELECT objtype, objname, name, value
  FROM [sys].[fn_listextendedproperty] (NULL, 'schema', @SCHEMANAME, 'table', @TBLNAME, 'column', NULL);
  IF @EXTENDEDPROPERTIES <> '' COLLATE SQL_Latin1_General_CP1_CI_AS
    SET @EXTENDEDPROPERTIES = @vbCrLf + 'GO' COLLATE SQL_Latin1_General_CP1_CI_AS + @vbCrLf + @EXTENDEDPROPERTIES;
--##############################################################################
--FINAL CLEANUP AND PRESENTATION
--##############################################################################
--at this point, there is a trailing comma, or it blank
  SELECT
    @FINALSQL = @FINALSQL
                + @CONSTRAINTSQLS
                + @CHECKCONSTSQLS
                + @FKSQLS;
--note that this trims the trailing comma from the end of the statements
  SET @FINALSQL = SUBSTRING(@FINALSQL,1,LEN(@FINALSQL) -1) ;
  SET @FINALSQL = @FINALSQL + ')'  COLLATE SQL_Latin1_General_CP1_CI_AS + @vbCrLf ;
  SET @input = @vbCrLf
       + @FINALSQL
       + @INDEXSQLS
       + @RULESCONSTSQLS
       + @TRIGGERSTATEMENT
       + @EXTENDEDPROPERTIES;
  SELECT @input AS [Item];
         
  RETURN 0;     
END; --PROC
GO
--#################################################################################################
--Mark as a system object
EXECUTE [sys].[sp_MS_marksystemobject] 'sp_GetDDL';
GRANT EXECUTE ON [dbo].[sp_GetDDL] TO PUBLIC;
--#################################################################################################
GO
	
	*/
END;


SP SpOperationDBBackup

			

CREATE procedure [dbo].[SpOperationDBBackup]
AS
BEGIN 
	DECLARE @dbName as varchar(255) = DB_NAME();
	DECLARE @fileName as varchar(1024) = CONCAT('C:\Database\',@dbName,'_',FORMAT(GETDATE(),'yyyyMMdd'),'.bak');

	DBCC SHRINKFILE (2, 1); BACKUP DATABASE @dbName TO DISK = @fileName;
	DBCC SHRINKFILE (2, 1); BACKUP DATABASE @dbName TO DISK = @fileName;
END;


--PATH ON LINUX:  '/var/backups/DBbackup/hotels.bak'

SP SpOperationAutoUpdateDbTemplateDoc

			
CREATE procedure [dbo].[SpOperationAutoUpdateDbTemplateDoc] --(@result varchar(255) OUTPUT) --string otput
AS
BEGIN 

	-- TYPES P=SQL_STORED_PROCEDURE, TR=TRIGGER, IF=FUNCTION, V=VIEW

	--CLEAN OLD DEFINITIONS
	DELETE FROM [dbo].[DocSrvDocTemplateList] WHERE CONVERT(varchar(MAX),[Description]) IN ('SQL_STORED_PROCEDURE','SQL_TRIGGER','VIEW','SQL_INLINE_TABLE_VALUED_FUNCTION','SQL_SCALAR_FUNCTION');
	DELETE FROM [dbo].[DocSrvDocTemplateList] WHERE CONVERT(varchar(MAX),[Description]) IN ('TABLE');

	--INSERT ALL OTHER DEFINITIONS
	INSERT INTO [dbo].[DocSrvDocTemplateList] ([GroupId],[InheritedCodeType],[Sequence],[Name],[Description],[Template],[UserId])
	SELECT 8,'MSSQL',2000, 
		CASE SO.[type] COLLATE DATABASE_DEFAULT
		 WHEN 'P' THEN CONCAT('SP ',SO.[name] COLLATE DATABASE_DEFAULT)
		 WHEN 'TR' THEN CONCAT('TR ',SO.[name] COLLATE DATABASE_DEFAULT)
		 WHEN 'IF' THEN CONCAT('FN ',SO.[name] COLLATE DATABASE_DEFAULT)
		 WHEN 'V' THEN CONCAT('VIEW ',SO.[name] COLLATE DATABASE_DEFAULT)
		 ELSE  CONCAT(SO.[type],SO.[name] COLLATE DATABASE_DEFAULT)
		 END AS [Name],
	SO.[type_desc] COLLATE DATABASE_DEFAULT, SM.[definition] COLLATE DATABASE_DEFAULT,1
	FROM sys.sql_modules SM INNER JOIN sys.Objects SO ON SM.Object_id = SO.Object_id ;


	-- INSERTING TABLE DEFINITIONS PART
	DECLARE @RowCnt int; SET @RowCnt = 0;
	DECLARE @TableName NVarChar(250);DECLARE @TableDefinition NVarChar(MAX);
	DECLARE @TableList TABLE (RowNum int IDENTITY (1, 1) Primary key NOT NULL,[TableName] nvarchar(250) NOT NULL);
	DECLARE @TableDefinitionList TABLE (RowNum int IDENTITY (1, 1) Primary key NOT NULL, [Template] text NULL);

	INSERT INTO @TableList ([TableName]) EXEC [dbo].SystemSpGetTableList;
	
	WHILE @RowCnt <= (SELECT COUNT([RowNum]) FROM @tableList)
	BEGIN
		SET @RowCnt = @RowCnt + 1;
		SELECT @TableName = [TableName] FROM @TableList WHERE [RowNum] = @RowCnt;

		INSERT INTO @TableDefinitionList([Template]) EXEC sp_GetDDL @TableName;
	END
	
	--INSERT TABLE DEFINITIONS
	INSERT INTO [dbo].[DocSrvDocTemplateList] ([GroupId],[InheritedCodeType],[Sequence],[Name],[Description],[Template],[UserId])
	SELECT 8,'MSSQL',1000,CONCAT('TBL ',tl.[TableName]),'TABLE',tdl.[Template],1 FROM @TableList tl LEFT JOIN @TableDefinitionList tdl ON tl.RowNum = tdl.RowNum;

	SELECT 'Update Templates in Doc Completed' as 'MessageList';
END;


SP SystemSpGetTableList

			




CREATE procedure [dbo].[SystemSpGetTableList]
AS
BEGIN 

	--GET ALL TABLES
	SELECT TABLE_NAME as 'TableList'
	FROM INFORMATION_SCHEMA.TABLES

	UNION 

	--GET ALL VIEWS
	SELECT 
	  TABLE_NAME as 'TableList'
	FROM INFORMATION_SCHEMA.VIEWS

END;


SP DB_HELP_INFO

			



CREATE procedure [dbo].[DB_HELP_INFO](@itemId int, @count int, @userId int)
AS
BEGIN 
	SET NOCOUNT ON;
	BEGIN TRAN
		BEGIN TRY

		--GET ALL INFO AOUT TABLES
		--sp_help '[dbo].[BusinessBranchList]'

		--REPAIR Id blocked by FOREIGN Key
		--DELETE FROM [GLOBAL].[dbo].[AddressList]
		--DBCC CHECKIDENT ([AddressList], RESEED, 0)

		--INSERT first ID
		--INSERT INTO AddressList(AddressType, CompanyName, ContactName, Street, City, PostCode, Phone, Email, BankAccount, Ico, Dic, UserId, Active)
		--VALUES ('all', 'KlikneteZde.Cz', 'Libor Svoboda', 'Žlutava 173', 'Žlutava', '763 61', '00420 724986873', '', '', '', '', 1, 1)
		--INSERT INTO AddressList(AddressType, CompanyName, ContactName, Street, City, PostCode, Phone, Email, BankAccount, Ico, Dic, UserId, Active)
		--VALUES        ('all', 'GroupWare-Solution.Eu', 'Libor Svoboda', 'Žlutava 173', 'Žlutava', '763 61', '00420 724986873', '', '', '', '', 1, 1)
		
		-- CLONE TABLE with DATA WITHOUT KEYS AND INDEXES
		--SELECT * INTO [GLOBAL].[dbo].[ItemList] FROM [SHOPINGER].[dbo].[ItemList]

		--COPY DATA FTOM TABLE TO ANOTHER TABLE
		--INSERT INTO [dbo].[ServerDynamicApiSecurityList] (
		--[InheritedApiType], [Name], [Description], [UrlSubPath], [AllowedRoles],
		--[RestrictedAccess], [RedirectPathOnError], [Active], [UserId]
		--) SELECT 
		--[InheritedPageType],
		--[Name],[Description],[UrlSubPath],[AllowedRoles],[RestrictedAccess],[RedirectPathOnError],[Active],[UserId]
		--DELETE FROM [dbo].[ServerModuleAndServiceList] 
		--Where InheritedPageType = 'ServerApi'


		--CLONE TABLE
		--DBCC CLONEDATABASE (source_database_name, target_database_name)[WITH [NO_STATISTICS][,NO_QUERYSTORE]] 

		----BACKUP
		--USE[SHOPINGER]
		--DROP USER [shopinger];
		--DBCC SHRINKFILE (SHOPINGER_log, 1);
		--BACKUP DATABASE [SHOPINGER] TO DISK = N'C:\Database\SHOPINGER.bak'
		--DBCC SHRINKFILE (SHOPINGER_log, 1);
		--BACKUP DATABASE [SHOPINGER] TO DISK = N'C:\Database\SHOPINGER.bak'
		--GO

		--USE [SHOPINGER]
		--BEGIN TRY CREATE USER [shopinger] FOR LOGIN [shopinger] END TRY BEGIN CATCH END CATCH;
		--BEGIN TRY ALTER ROLE [db_datareader] ADD MEMBER [shopinger]; END TRY BEGIN CATCH END CATCH;


		----RESTORE TO NEW FILES
		--ALTER DATABASE [SHOPINGER] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
		--RESTORE DATABASE [SHOPINGER] FROM DISK = N'C:\Database\SHOPINGER.bak' 
		--WITH MOVE N'SHOPINGER' TO N'C:\Database\SHOPINGER.mdf',  
		--     MOVE N'SHOPINGER_log' TO N'C:\Database\SHOPINGER_log.ldf', FILE = 2,
		--RECOVERY,  REPLACE,  STATS = 10;
		--ALTER DATABASE [SHOPINGER] SET MULTI_USER;

		--COPY DATA FROM TABLE TO TABLE
		--INSERT INTO newTable
		--SELECT * FROM oldTable

		-- Shadow Copy original table to create new with data NEW: ProdGuidGroupList   , original :GroupList
		--SELECT * INTO [EASYDATACenter].[dbo].[ProdGuidGroupList1] FROM [VYKONY].dbo.GroupList

		COMMIT TRANSACTION
        END TRY
        BEGIN CATCH
              ROLLBACK TRANSACTION
        END CATCH
END;


SP SpOperationFillTranslationTableList

			



CREATE procedure [dbo].[SpOperationFillTranslationTableList]
AS
BEGIN 

DECLARE @tableList TABLE (RowID int not null identity(1,1) primary key,[TableName] nvarchar(250) NOT NULL);
DECLARE @columnList TABLE ([ColumnName] nvarchar(250) NOT NULL);
DECLARE @resultList TABLE ([SystemName] nvarchar(50) NOT NULL);

	--GET ALL TABLES
	INSERT INTO @tableList ([TableName])
	SELECT TABLE_NAME as 'TableList'
	FROM INFORMATION_SCHEMA.TABLES
	WHERE table_type = 'BASE TABLE'

	UNION 

	--GET ALL VIEWS
	SELECT 
	  TABLE_NAME as 'TableList'
	FROM INFORMATION_SCHEMA.VIEWS;

	--START Save For Result
	INSERT INTO @resultList ( [SystemName])
	SELECT LOWER(LEFT(T1.[TableName],1))+SUBSTRING(T1.[TableName],2,LEN(T1.[TableName])) FROM @tableList T1
	where NOT EXISTS (SELECT 1 FROM [dbo].[SystemTranslationList] T2 where T2.[SystemName] = T1.TableName);
	--END Save For Result

	INSERT INTO [dbo].[SystemTranslationList] ( [SystemName],[UserId])
	SELECT LOWER(LEFT(T1.[TableName],1))+SUBSTRING(T1.[TableName],2,LEN(T1.[TableName])),1 FROM @tableList T1
	where NOT EXISTS (SELECT 1 FROM [dbo].[SystemTranslationList] T2 where T2.[SystemName] = T1.TableName);

	declare @i int;declare @max int;
	select @i = min(RowID) from @tableList;
	select @max = max(RowID) from @tableList;
	DECLARE @columnName varchar(255);
	
	WHILE @i <= @max BEGIN

		SELECT @columnName = [TableName] FROM @tableList where RowID = @i;

		INSERT INTO @columnList ([ColumnName])
		SELECT COLUMN_NAME
		FROM INFORMATION_SCHEMA.COLUMNS T1
		WHERE TABLE_NAME = @columnName;

		SET @i = @i + 1
	END

	--START Save For Result
	INSERT INTO @resultList ( [SystemName])
	SELECT DISTINCT LOWER(LEFT(T1.[ColumnName],1))+SUBSTRING(T1.[ColumnName],2,LEN(T1.[ColumnName])) FROM @columnList T1
	WHERE NOT EXISTS (SELECT 1 FROM [dbo].[SystemTranslationList] T2 WHERE T2.[SystemName] = T1.[ColumnName]);
	--END Save For Result

	INSERT INTO [dbo].[SystemTranslationList] ( [SystemName],[UserId])
	SELECT DISTINCT LOWER(LEFT(T1.[ColumnName],1))+SUBSTRING(T1.[ColumnName],2,LEN(T1.[ColumnName])),1 FROM @columnList T1
	WHERE NOT EXISTS (SELECT 1 FROM [dbo].[SystemTranslationList] T2 WHERE T2.[SystemName] = T1.[ColumnName]);

	--Copy Translation from xxxListPage to xxxList
	UPDATE TargetTbl
	SET
		TargetTbl.DescriptionCz = SourceTbl.DescriptionCz,
		TargetTbl.DescriptionEn = SourceTbl.DescriptionEn
	FROM
		[dbo].[SystemTranslationList] AS TargetTbl
		INNER JOIN [dbo].[SystemTranslationList] AS SourceTbl
			ON SourceTbl.SystemName = CONCAT(TargetTbl.SystemName,'Page')
	WHERE
		LEN(TargetTbl.DescriptionCz) = 0 AND
		SourceTbl.SystemName LIKE '%ListPage'

	--Return List Of New Translation Words
	--SELECT * FROM @resultList;
	SELECT 'Update TranslationList From DB Schema is Completed' as 'MessageList';
END;


SP SpShowDBProcedureList

			





CREATE procedure [dbo].[SpShowDBProcedureList]
AS
BEGIN 
	SELECT SO.[type_desc], SO.[name], SM.[definition],SO.create_date,SO.modify_date 
	FROM sys.sql_modules SM INNER JOIN sys.Objects SO ON SM.Object_id = SO.Object_id 
	--WHERE SO.[type_desc] = 'SP'
	ORDER BY SO.[type_desc], SO.[name];
	;
END;



SP SpImportSvgIcon

			
CREATE PROCEDURE [dbo].[SpImportSvgIcon] (
     @IconName NVARCHAR (100)
   , @ImageFullPath NVARCHAR (1000)
   )
AS
BEGIN
   DECLARE @tsql NVARCHAR (2000);
   SET NOCOUNT ON

   SET @tsql = 'INSERT INTO SystemSvgIconList ([Name],[UserId], [SvgIconPath]) ' +
               ' SELECT ' + '''' + @IconName + '''' + ',1, * ' + 
               'FROM Openrowset( Bulk ' + '''' + @ImageFullPath + '''' + ', Single_Blob) as img'
   EXEC (@tsql)
   SET NOCOUNT OFF
END


SP SpProvider_SendSqlScript

			

-- Its Procedure From Provider To Customer
-- @TargetLinkedDb  must be In Format: 95.183.52.33 or 95.183.52.33,1433 or SNRJDI\SLAMANAGEMENT

CREATE procedure [dbo].[SpProvider_SendSqlScript](@TargetIp varchar(255),@TargetDBName varchar(255),
@UserName varchar(255),@Password varchar(255),@TableName varchar(255)
)
AS
BEGIN 
	DECLARE @result as varchar(max);SET @result = 'Distribution SQLScript: ' + CHAR(13)+CHAR(10);
	DECLARE @stepNo as int = 0;DECLARE @SqlScript as VARCHAR(MAX) ='';

	

	SET @result +=CAST(@stepNo AS VARCHAR(10)) + ' Start Setting Linked Server' + CHAR(13)+CHAR(10);
	BEGIN TRY 
		BEGIN TRY EXEC sp_addlinkedserver @server = @TargetIp, @srvproduct=N'SQL Server'; END TRY BEGIN CATCH END CATCH;
		--EXEC sp_addlinkedserver @server = @TargetIp, @srvproduct=N'SQL Server', @provider=N'SQLNCLI';
		
		EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = @TargetIp, @locallogin=N'easyitcenter', @useself=N'True', @rmtuser=NULL, @rmtpassword=NULL;
		EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = @TargetIp, @locallogin = NULL , @useself = N'False', @rmtuser = N'sa', @rmtpassword = N'Hotel2023+'
		SET @result +=CAST(@stepNo AS VARCHAR(10))  + ' Setting Linked Server OK' + CHAR(13)+CHAR(10);
	END TRY
	BEGIN CATCH SELECT @result += CONCAT(CAST(@stepNo AS VARCHAR(10)) + ' Error No: ',ERROR_NUMBER(),' = Process Jumped',CHAR(13)+CHAR(10), ERROR_MESSAGE(),CHAR(13)+CHAR(10)+CHAR(13)+CHAR(10)); END CATCH;
	SET @stepNo += 10;





	SET @result += CAST(@stepNo AS VARCHAR(10)) + ' Start Preparing Script' + CHAR(13)+CHAR(10);
	BEGIN TRY 
		DECLARE @TableDefinitionList TABLE (RowNum int IDENTITY (1, 1) Primary key NOT NULL, [Template] text NULL);
		INSERT INTO @TableDefinitionList([Template]) EXEC sp_GetDDL @TableName;
		SELECT @SqlScript = [Template] FROM @TableDefinitionList WHERE RowNum = 1;

			SET @SqlScript = REPLACE(@SqlScript,'','''');
			SET @SqlScript = REPLACE(@SqlScript,' GO','');

		SET @result += CAST(@stepNo AS VARCHAR(10))  + '  Preparing Script OK' + CHAR(13)+CHAR(10);
	END TRY
	BEGIN CATCH SELECT @result += CONCAT(CAST(@stepNo AS VARCHAR(10)) + ' Error No: ',ERROR_NUMBER(),' = Process Jumped',CHAR(13)+CHAR(10), ERROR_MESSAGE(),CHAR(13)+CHAR(10)+CHAR(13)+CHAR(10)); END CATCH;
	SET @stepNo += 10;








	SET @result +=CAST(@stepNo AS VARCHAR(10)) + ' Start Executing Script' + CHAR(13)+CHAR(10);
	BEGIN TRY 
		DECLARE @TablePart AS VARCHAR(MAX) ='';
		DECLARE @TriggerPart AS VARCHAR(MAX) ='';

		PRINT @SqlScript;
		SELECT @TablePart = SUBSTRING(@SqlScript,0,CHARINDEX('TRIGGER',@SqlScript,0)), @TriggerPart = SUBSTRING(@SqlScript,CHARINDEX('TRIGGER',@SqlScript,0)+1,LEN(@SqlScript));
		EXEC (@TablePart);
		EXEC (@TriggerPart);

		SET @result +=CAST(@stepNo AS VARCHAR(10)) + ' Executing Script OK' + CHAR(13)+CHAR(10);
	END TRY
	BEGIN CATCH SELECT @result += CONCAT(CAST(@stepNo AS VARCHAR(10)) + ' Error No: ',ERROR_NUMBER(),' = Process Jumped',CHAR(13)+CHAR(10), ERROR_MESSAGE(),CHAR(13)+CHAR(10)+CHAR(13)+CHAR(10)); END CATCH;
	SET @stepNo += 10;



	SET @result +=CAST(@stepNo AS VARCHAR(10)) + ' Process Done' + CHAR(13)+CHAR(10);
	SELECT @result as 'MessageList';
END;


PRINT CONCAT('SQL Distribution Script Result: ', CHAR(13)+CHAR(10),@result);-- as 'MessageList';


SP SpOperationRunSqlScript

			
CREATE procedure [dbo].[SpOperationRunSqlScript](@sqlScript varchar(MAX))
AS
BEGIN 
	DECLARE @result VARCHAR(MAX) = '';

	BEGIN TRY 
		EXEC (@sqlScript);
	END TRY
	BEGIN CATCH SELECT @result = CONCAT('Error No: ',ERROR_NUMBER(),CHAR(13)+CHAR(10), ERROR_MESSAGE()); END CATCH;

	PRINT @result;
END;


SP SpOperationAutoGenDescToDocs

			

CREATE procedure [dbo].[SpOperationAutoGenDescToDocs]
AS
BEGIN 
	DECLARE @Error VarChar(MAX);
	DECLARE @RazorPortal VarChar(MAX);
	DECLARE @PreparedNewsList VarChar(MAX); DECLARE @ProcessingTaskList VarChar(MAX); DECLARE @ChangeLogList VarChar(MAX);

	DECLARE @GroupId Int;DECLARE @Name VarChar(50);DECLARE @Description VarChar(Max);DECLARE @Template VarChar(Max);

	DECLARE @PrewTargetType VarChar(150);DECLARE @TargetType VarChar(150); DECLARE @StatusType VarChar(150);  DECLARE @Value VarChar(150); 
	DECLARE @Request VarChar(MAX); DECLARE @Documentation VarChar(MAX); DECLARE @Image VarBinary(Max);
	
	--Generate RazorPortalAutoDoc
	BEGIN TRY  
		DECLARE db_cursor1 CURSOR LOCAL FOR SELECT dtl.[GroupId],dtl.[Name],dtl.[Description],dtl.[Template] FROM [dbo].[DocSrvDocTemplateList] dtl WHERE dtl.Name LIKE '%cshtml%'
		
		SET @RazorPortal = char(13) + '# Úplný kód MVC Razor Portálu CSHTML,   ' + char(13) + char(13) + 's JS,Metro4, nutný Build,Vývoj 1 Měsíc, nyní se již nepoužívá   ' + char(13) + char(13) + char(13);
		OPEN db_cursor1;
		FETCH NEXT FROM db_cursor1 INTO @GroupId, @Name, @Description, @Template;
		
		WHILE @@FETCH_STATUS = 0  
		BEGIN 
			SET @RazorPortal += '### ' + @Name + '     
' + char(13) + char(13) + '
```http   
			' + char(13) + @Template + char(13) + '
		' + char(13) + '

		' + char(13)  + char(13);

		FETCH NEXT FROM db_cursor1 INTO @GroupId, @Name, @Description, @Template;
	END;
	CLOSE db_cursor1;
	DEALLOCATE db_cursor1;

	--SAVE RazorPortalAutoDoc
	INSERT INTO [dbo].[DocSrvDocumentationList] ([DocumentationGroupId],[Name], [Description],[Sequence],[MdContent],[HtmlContent],[UserId],[Active],[AutoVersion])
	VALUES(@GroupId,'Zrušený MVC Web Portal CsHtml','Je možné Vytěžit Generátory kódu a Objekty Metro4',100,@RazorPortal,@RazorPortal,1,1,1);

END TRY  
BEGIN CATCH  
	SELECT @Error = CONCAT('RazorPortalAutoDoc',' ,ErrNo:',CAST(ERROR_NUMBER() AS VARCHAR),' ,Message:',ERROR_MESSAGE()); 
	INSERT INTO [dbo].[SolutionFailList] ([Source],[Message]) VALUES('Database', @Error);
END CATCH;


--Generate XamlAutoDoc
BEGIN TRY  
	DECLARE db_cursor2 CURSOR LOCAL FOR SELECT dtl.[GroupId],dtl.[Name],dtl.[Description],dtl.[Template] FROM [dbo].[DocSrvDocTemplateList] dtl WHERE dtl.Name LIKE '%XAML%'
	
	SET @RazorPortal = char(13) + '# ESB -WPF XAML Šablony,   

' + char(13) + char(13) + ' Standardní I mediální šablony pro Vývoj Systému ' + char(13) + char(13) + char(13); OPEN db_cursor2; FETCH NEXT FROM db_cursor2 INTO @GroupId, @Name, @Description, @Template;

	WHILE @@FETCH_STATUS = 0  
	BEGIN 
		SET @RazorPortal += '### ' + @Name + '     
		' + char(13) + char(13) + '
			' + char(13) + @Template + char(13) + '
		' + char(13) + '

		' + char(13)  + char(13);

		FETCH NEXT FROM db_cursor2 INTO @GroupId, @Name, @Description, @Template;
	END;
	CLOSE db_cursor2;
	DEALLOCATE db_cursor2;

	--SAVE XAMLTemplatesAutoDoc
	INSERT INTO [dbo].[DocSrvDocumentationList] ([DocumentationGroupId],[Name], [Description],[Sequence],[MdContent],[HtmlContent],[UserId],[Active],[AutoVersion])
	VALUES(@GroupId,'XAML Šablony Systému','Těchto pár Šablon Stačí na tvorbu Multimediálního Systému',300,@RazorPortal,@RazorPortal,1,1,1);

END TRY  
BEGIN CATCH  
	SELECT @Error = CONCAT('XAMLTemplatesAutoDoc',' ,ErrNo:',CAST(ERROR_NUMBER() AS VARCHAR),' ,Message:',ERROR_MESSAGE()); 
	INSERT INTO [dbo].[SolutionFailList] ([Source],[Message]) VALUES('Database', @Error);
END CATCH;

--Generate C#APIAutoDoc
BEGIN TRY  
	DECLARE db_cursor3 CURSOR LOCAL FOR SELECT dtl.[GroupId],dtl.[Name],dtl.[Description],dtl.[Template] FROM [dbo].[DocSrvDocTemplateList] dtl WHERE dtl.Name LIKE '%C# API%'
	
	SET @RazorPortal = char(13) + '# EIC- C# API Šablony,   

' + char(13) + char(13) + 'Standardní C# API pro Vývoj Babkend APi Služeb
' + char(13) + char(13) + char(13); OPEN db_cursor3; FETCH NEXT FROM db_cursor3 INTO @GroupId, @Name, @Description, @Template;

	WHILE @@FETCH_STATUS = 0  
	BEGIN 
		SET @RazorPortal += '### ' + @Name + '     

' + char(13) + char(13) + '

			' + char(13) + @Template + char(13) + '
		' + char(13) + '

		' + char(13)  + char(13);

		FETCH NEXT FROM db_cursor3 INTO @GroupId, @Name, @Description, @Template;
	END;
	CLOSE db_cursor3;
	DEALLOCATE db_cursor3;

	--SAVE C#APITemplatesAutoDoc
	INSERT INTO [dbo].[DocSrvDocumentationList] ([DocumentationGroupId],[Name], [Description],[Sequence],[MdContent],[HtmlContent],[UserId],[Active],[AutoVersion])
	VALUES(@GroupId,'API Šablony Systému','Těchto pár Šablon Stačí na tvorbu Libovolného Backend Serveru',300,@RazorPortal,@RazorPortal,1,1,1);

END TRY  
BEGIN CATCH  
	SELECT @Error = CONCAT('APITemplatesAutoDoc',' ,ErrNo:',CAST(ERROR_NUMBER() AS VARCHAR),' ,Message:',ERROR_MESSAGE()); 
	INSERT INTO [dbo].[SolutionFailList] ([Source],[Message]) VALUES('Database', @Error);
END CATCH;

--Generate DBTablesAutoDoc
BEGIN TRY  
	DECLARE db_cursor4 CURSOR LOCAL FOR SELECT dtl.[GroupId],dtl.[Name],dtl.[Description],dtl.[Template] FROM [dbo].[DocSrvDocTemplateList] dtl WHERE dtl.[Description] LIKE 'TABLE';
	
	SET @RazorPortal = char(13) + '# DB - Export Tabulek Řešení,   

' + char(13) + char(13) + 'Zde najdete Všechny Tabulky Řešení, Struktura má Centrální Logiku, která zamezuje vzniku chyb
' + char(13) + char(13) + char(13); OPEN db_cursor4; FETCH NEXT FROM db_cursor4 INTO @GroupId, @Name, @Description, @Template;

	WHILE @@FETCH_STATUS = 0  
	BEGIN 
		SET @RazorPortal += '### ' + @Name + '     

' + char(13) + '

			' + char(13) + @Template + char(13) + '
		' + char(13) + '

		' + char(13)  + char(13);

		FETCH NEXT FROM db_cursor4 INTO @GroupId, @Name, @Description, @Template;
	END;
	CLOSE db_cursor4;
	DEALLOCATE db_cursor4;

	--SAVE DBTablesAutoDoc
	INSERT INTO [dbo].[DocSrvDocumentationList] ([DocumentationGroupId],[Name], [Description],[Sequence],[MdContent],[HtmlContent],[UserId],[Active],[AutoVersion])
	VALUES(@GroupId,'DB Tabulky Řešení','Struktura Tabulek te stále Téměř totožná, Pár Pravidel stačí k vytvoření dokonalého Systému',100,@RazorPortal,@RazorPortal,1,1,1);

END TRY  
BEGIN CATCH  
	SELECT @Error = CONCAT('DBTablesAutoDoc',' ,ErrNo:',CAST(ERROR_NUMBER() AS VARCHAR),' ,Message:',ERROR_MESSAGE()); 
	INSERT INTO [dbo].[SolutionFailList] ([Source],[Message]) VALUES('Database', @Error);
END CATCH;

--Generate DBProceduresAutoDoc
BEGIN TRY  
	DECLARE db_cursor5 CURSOR LOCAL FOR SELECT dtl.[GroupId],dtl.[Name],dtl.[Description],dtl.[Template] FROM [dbo].[DocSrvDocTemplateList] dtl WHERE dtl.[Description] LIKE 'SQL_STORED_PROCEDURE';
	
	SET @RazorPortal = char(13) + '# DB - Export Procedur Řešení,   

' + char(13) + char(13) + 'Zde procedury pro automatizaci, Hromadné Operace, Správu DB
' + char(13) + char(13) + char(13); OPEN db_cursor5; FETCH NEXT FROM db_cursor5 INTO @GroupId, @Name, @Description, @Template;

	WHILE @@FETCH_STATUS = 0  
	BEGIN 
		SET @RazorPortal += '### ' + @Name + '     

' + char(13) + '

			' + char(13) + @Template + char(13) + '
		' + char(13) + '

		' + char(13)  + char(13);

		FETCH NEXT FROM db_cursor5 INTO @GroupId, @Name, @Description, @Template;
	END;
	CLOSE db_cursor5;
	DEALLOCATE db_cursor5;

	--SAVE DBProceduresAutoDoc
	INSERT INTO [dbo].[DocSrvDocumentationList] ([DocumentationGroupId],[Name], [Description],[Sequence],[MdContent],[HtmlContent],[UserId],[Active],[AutoVersion])
	VALUES(@GroupId,'DB Procedury Řešení','Vytvořené procedury pro automatizaci, Hromadné Operace, Správu DB',200,@RazorPortal,@RazorPortal,1,1,1);

END TRY  
BEGIN CATCH  
	SELECT @Error = CONCAT('DBProceduresAutoDoc',' ,ErrNo:',CAST(ERROR_NUMBER() AS VARCHAR),' ,Message:',ERROR_MESSAGE()); 
	INSERT INTO [dbo].[SolutionFailList] ([Source],[Message]) VALUES('Database', @Error);
END CATCH;



--Generate DBTriggersAutoDoc
BEGIN TRY  
	DECLARE db_cursor6 CURSOR LOCAL FOR SELECT dtl.[GroupId],dtl.[Name],dtl.[Description],dtl.[Template] FROM [dbo].[DocSrvDocTemplateList] dtl WHERE dtl.[Description] LIKE 'SQL_TRIGGER';
	
	SET @RazorPortal = char(13) + '# DB - Export Procedur Řešení,   

' + char(13) + 'Zde najdete procedury, které stanovují pevnou a jasnou strukturu a vazby již v databázi
' + char(13) + char(13) + char(13); OPEN db_cursor6; FETCH NEXT FROM db_cursor6 INTO @GroupId, @Name, @Description, @Template;

	WHILE @@FETCH_STATUS = 0  
	BEGIN 
		SET @RazorPortal += '### ' + @Name + '     
		' + char(13) + char(13) + '
			' + char(13) + @Template + char(13) + '
		' + char(13) + '

		' + char(13);

		FETCH NEXT FROM db_cursor6 INTO @GroupId, @Name, @Description, @Template;
	END;
	CLOSE db_cursor6;
	DEALLOCATE db_cursor6;

	--SAVE DBTriggersAutoDoc
	INSERT INTO [dbo].[DocSrvDocumentationList] ([DocumentationGroupId],[Name], [Description],[Sequence],[MdContent],[HtmlContent],[UserId],[Active],[AutoVersion])
	VALUES(@GroupId,'DB Triggery','Základem je nastavit pevnou a jasnou strukturu a vazby již v databázi',300,@RazorPortal,@RazorPortal,1,1,1);

END TRY  
BEGIN CATCH  
	SELECT @Error = CONCAT('DBTriggersAutoDoc',' ,ErrNo:',CAST(ERROR_NUMBER() AS VARCHAR),' ,Message:',ERROR_MESSAGE()); 
	INSERT INTO [dbo].[SolutionFailList] ([Source],[Message]) VALUES('Database', @Error);
END CATCH;

--Generate DBViewAutoDoc
BEGIN TRY  
	DECLARE db_cursor7 CURSOR LOCAL FOR SELECT dtl.[GroupId],dtl.[Name],dtl.[Description],dtl.[Template] FROM [dbo].[DocSrvDocTemplateList] dtl WHERE dtl.[Description] LIKE 'VIEW' 
	OR dtl.[Description] LIKE 'SQL_SCALAR_FUNCTION' OR dtl.[Description] LIKE 'SQL_INLINE_TABLE_VALUED_FUNCTION';
	
	SET @RazorPortal = char(13) + '# DB - Export Views a Funkcí Řešení,   

' + char(13) + 'Zde najdete složené Datapohledy a Funkce
' + char(13) ; OPEN db_cursor7; FETCH NEXT FROM db_cursor7 INTO @GroupId, @Name, @Description, @Template;

	WHILE @@FETCH_STATUS = 0  
	BEGIN 
		SET @RazorPortal += '### ' + @Name + '     
		' + char(13) + '
```    ' + char(13) + '
---   
			' + char(13)  + char(13);

			FETCH NEXT FROM db_cursor7 INTO @GroupId, @Name, @Description, @Template;
		END;
		CLOSE db_cursor7;
		DEALLOCATE db_cursor7;

		--SAVE DBViewsAutoDoc
		INSERT INTO [dbo].[DocSrvDocumentationList] ([DocumentationGroupId],[Name], [Description],[Sequence],[MdContent],[HtmlContent],[UserId],[Active],[AutoVersion])
		VALUES(@GroupId,'DB View a Funkce','Složené Datapohledy a Funkce',400,@RazorPortal,@RazorPortal,1,1,1);

	END TRY  
	BEGIN CATCH  
		SELECT @Error = CONCAT('DBViewsAutoDoc',' ,ErrNo:',CAST(ERROR_NUMBER() AS VARCHAR),' ,Message:',ERROR_MESSAGE()); 
		INSERT INTO [dbo].[SolutionFailList] ([Source],[Message]) VALUES('Database', @Error);
	END CATCH;


	--END OF EXPORT TEMPLATES

	--START EXPORT PREPARED NEWS / CHANGELOG 

	--Generate Prepared News, Processing, ChangeLog
	BEGIN TRY  
		DECLARE db_cursor8 CURSOR LOCAL FOR SELECT stl.[InheritedTargetType],stl2.DescriptionCz,stl.[Message], stl.[Documentation], stl.[Image]
		FROM [dbo].[SolutionTaskList] stl,  [dbo].[SystemTranslationList] stl2
		WHERE stl.[InheritedStatusType]  = stl2.SystemName AND stl.[InheritedStatusType] = 'Waiting'
		ORDER BY stl.[InheritedTargetType];
		--	CASE stl.[InheritedStatusType] 
		--	WHEN 'Done' THEN 1
		--	WHEN 'Upgrading' THEN 2
		--	WHEN 'Processing' THEN 2	
		--	WHEN 'Waiting' THEN 3
		--	ELSE 4
		--	END ASC,
		
		--	stl.[TimeStamp];
	

		SET @PreparedNewsList = char(13) + '# Připravované Novinky,   
		' + char(13) + char(13) + 'Zde je seznam dalších chystaných funkcionalit, které posouvá vývoj.   
		To Hlavní Je přípravaWeb Portálu ONLINE s Vývojem kódu Mnanagovaným Centrálním Řešením.   
		to Nabízí Vždy aktializace po ruce Obosměrné rozšiřování Projektů a Centralizaci Agend.   
		Tím z tohoto řešení Bude Nejlevnější IT šeření Tak Rozsáhlého Charakteru.    
		' + char(13) + char(13) + char(13);

		OPEN db_cursor8  
		FETCH NEXT FROM db_cursor8 INTO @TargetType, @StatusType, @Request, @Documentation ,@Image
		WHILE @@FETCH_STATUS = 0  
		BEGIN 
			
			IF(@PrewTargetType <> @TargetType) BEGIN
			SET @PreparedNewsList += '
---    ' + char(13) + '### ' + @TargetType + '     
			' + char(13);
			END
			
			SET @PreparedNewsList +='1. ' + @Request + char(13);
			
			SET @PrewTargetType = @TargetType;
			FETCH NEXT FROM db_cursor8 INTO @TargetType, @StatusType, @Request, @Documentation ,@Image
		END;
		CLOSE db_cursor8;
		DEALLOCATE db_cursor8;


		--SAVE Prepared News
		INSERT INTO [dbo].[DocSrvDocumentationList] ([DocumentationGroupId],[Name], [Description],[Sequence],[MdContent],[HtmlContent],[UserId],[Active],[AutoVersion])
		VALUES(7,'Připravované Novinky','Seznam nejprioritnějších Rozšíření Systému. Ty budou zaimlemetovány během 6 měsíců
		protože se tomu můžu věnovat jen ve volném čase. Nejen Itéčkáři v naší zemi se místo vzdělávání soustředí jak pěníze čerpat
		místo tvořit přidanými hodnotami své činnosti. Připraveno je jíž přes více jak 500 vylepšení. Stačí stahovat z Github.
		',30,@PreparedNewsList,@PreparedNewsList,1,1,1);


	END TRY  
	BEGIN CATCH  
		SELECT @Error = CONCAT('PreparedNews',' ,ErrNo:',CAST(ERROR_NUMBER() AS VARCHAR),' ,Message:',ERROR_MESSAGE()); 
		INSERT INTO [dbo].[SolutionFailList] ([Source],[Message]) VALUES('Database', @Error);
	END CATCH


		--Generate Processing, ChangeLog
	BEGIN TRY  
		DECLARE db_cursor9 CURSOR LOCAL FOR SELECT stl.[InheritedTargetType],stl2.DescriptionCz,stl.[Message], stl.[Documentation], stl.[Image]
		FROM [dbo].[SolutionTaskList] stl,  [dbo].[SystemTranslationList] stl2
		WHERE stl.[InheritedStatusType]  = stl2.SystemName AND stl.[InheritedStatusType] <> 'Waiting'
		ORDER BY stl.[InheritedStatusType], stl.[InheritedTargetType];


		SET @PreparedNewsList = char(13) + '# Zpracovávané a zpracované Funkcionality,   
		' + char(13) + char(13) + 'Zde je vypsána ani setina toho co vše Dané projekty Umí.    
Myslím že chystaný vývoj Online z Webu a Editorů mluví za vše. Tak neplýtvejte financemi na    
čas zaměstanců či jiná řešení A Vyzkoušejte 30 denní verzu zdarma.     
		' + char(13) + char(13) + char(13);

		OPEN db_cursor9  
		FETCH NEXT FROM db_cursor9 INTO @TargetType, @StatusType, @Request, @Documentation ,@Image
		WHILE @@FETCH_STATUS = 0  
		BEGIN 
			
			IF(@PrewTargetType <> @TargetType) BEGIN
				SET @PreparedNewsList += char(13) + '### ' + @TargetType + '     
' + char(13);
			END
			
			SET @PreparedNewsList +='**' + @StatusType + '**
' + '1. ' + @Request + char(13) + '- ' + @Documentation  + char(13) + char(13) + '
---   
' + char(13);
			
			SET @PrewTargetType = @TargetType;
			FETCH NEXT FROM db_cursor9 INTO @TargetType, @StatusType, @Request, @Documentation ,@Image
		END;
		CLOSE db_cursor9;
		DEALLOCATE db_cursor9;


		--SAVE Changelog
		INSERT INTO [dbo].[DocSrvDocumentationList] ([DocumentationGroupId],[Name], [Description],[Sequence],[MdContent],[HtmlContent],[UserId],[Active],[AutoVersion])
		VALUES(7,'Zpracováváné A ChangeLog','Changelog jsem začal prat teprve ted. Každý úsek který vidíte, je výsledkem 2dnů práce macimálně.    
Pro představu co vše se dá zvládnout. Vyzkoušejte nebo požádejte o instalaci u vás ve firměš či doma a zkuste     
vyzkoušet vo vše dané řešení nabízí. ',800,@PreparedNewsList,@PreparedNewsList,1,1,1);


	END TRY  
	BEGIN CATCH  
		SELECT @Error = CONCAT('Changelog',' ,ErrNo:',CAST(ERROR_NUMBER() AS VARCHAR),' ,Message:',ERROR_MESSAGE()); 
		INSERT INTO [dbo].[SolutionFailList] ([Source],[Message]) VALUES('Database', @Error);
	END CATCH


	
	--GenerateServerConfig
	BEGIN TRY  
		DECLARE db_cursor11 CURSOR LOCAL FOR SELECT sl.InheritedGroupName,sl.[Key],sl.[Description]
		FROM [dbo].[ServerSettingList] sl
		ORDER BY sl.InheritedGroupName;


		SET @PreparedNewsList = char(13) + '# Základní Konfigurace Serveru,   
		' + char(13) + char(13) + 'Zde je Aktuální základní konfigurace serveru.Jsou do ní vytažené jen ty nejstěžejnější   
nastavení, protože k dispozici sich je stonásobně víckrát. 
To Vyplývá z počtu přes 100 nasazených technologií v 1 řešení parfekně vyladěných pro dokonalou práci.
' + char(13);

		OPEN db_cursor11  
		FETCH NEXT FROM db_cursor11 INTO @TargetType, @StatusType, @Documentation
		WHILE @@FETCH_STATUS = 0  
		BEGIN 
			
			IF(@PrewTargetType <> @TargetType) BEGIN
				SET @PreparedNewsList += + char(13) + '
---   
' + char(13) + '# ' + @TargetType + '         
' + char(13);
			END
			
			SET @PreparedNewsList +='**' + @StatusType + '**
' + char(13) + '- ' + @Documentation  + char(13) + char(13);
			
			SET @PrewTargetType = @TargetType;
			FETCH NEXT FROM db_cursor11 INTO @TargetType, @StatusType,@Documentation
		END;
		CLOSE db_cursor11;
		DEALLOCATE db_cursor11;


		--SAVE GenerateServerConfig
		INSERT INTO [dbo].[DocSrvDocumentationList] ([DocumentationGroupId],[Name], [Description],[Sequence],[MdContent],[HtmlContent],[UserId],[Active],[AutoVersion])
		VALUES(2,'Základní Konfigurace Serveru','Zde je Výčet Konfigurace serveru a popis co dané volby Dělají a znamenají. 
Když si je namalujete do pavouka zjistíte že to výkrývá téměř celé IT.',30,@PreparedNewsList,@PreparedNewsList,1,1,1);


	END TRY  
	BEGIN CATCH  
		SELECT @Error = CONCAT('GenerateServerConfig',' ,ErrNo:',CAST(ERROR_NUMBER() AS VARCHAR),' ,Message:',ERROR_MESSAGE()); 
		INSERT INTO [dbo].[SolutionFailList] ([Source],[Message]) VALUES('Database', @Error);
	END CATCH


		
	--GenerateAgendasList
	BEGIN TRY  
		DECLARE db_cursor12 CURSOR LOCAL FOR SELECT sg.SystemName,sm.MenuType,sm.FormPageName, sm.[Description]
		FROM [dbo].[SystemMenuList] sm, [dbo].[SystemGroupMenuList] sg
		WHERE sg.Id = sm.GroupId
		ORDER BY sg.SystemName, CASE sm.MenuType
			WHEN 'Dial' THEN 1
			WHEN 'Agenda' THEN 2
			ELSE 3
			END;


		SET @PreparedNewsList = char(13) + '# Seznam Implementovaných Agend,   
		' + char(13) + char(13) + 'Zde je Seznam implementovaných Agend Systému. Systém je aktuálně zaměřen na Správu IT, a všeho Okolo.
Je Modifikován tak Aby zvládnul všechny možné typy požadavků. Upravit sio je pro Svá data je otázkou v řádech týdnů, protože
disponuje všemi možnými nástroji pro zpracování každého typu požadavku.
' + char(13);

		OPEN db_cursor12  
		FETCH NEXT FROM db_cursor12 INTO @TargetType, @StatusType,@Value, @Documentation
		WHILE @@FETCH_STATUS = 0  
		BEGIN 
			
			IF(@PrewTargetType <> @TargetType) BEGIN
				SET @PreparedNewsList += + char(13) + '
---   
' + char(13) + '# ' + @TargetType + '         
' + char(13);
			END
			
			SET @PreparedNewsList +='- ' + @StatusType + '  **' + @Value + '**
' + char(13) + '*' + @Documentation  + '*' + char(13) + '
```    ' + char(13);
			
			SET @PrewTargetType = @TargetType;
			FETCH NEXT FROM db_cursor12 INTO @TargetType, @StatusType,@Value, @Documentation
		END;
		CLOSE db_cursor12;
		DEALLOCATE db_cursor12;


		--SAVE GenerateAgendasList
		INSERT INTO [dbo].[DocSrvDocumentationList] ([DocumentationGroupId],[Name], [Description],[Sequence],[MdContent],[HtmlContent],[UserId],[Active],[AutoVersion])
		VALUES(1,' Seznam Implementovaných Agend','Zde je Seznam implementovaných Agend Systému. Systém je aktuálně zaměřen na Správu IT, a všeho Okolo.
Je Modifikován tak Aby zvládnul všechny možné typy požadavků. Upravit sio je pro Svá data je otázkou v řádech týdnů, protože
disponuje všemi možnými nástroji pro zpracování každého požadavku.',30,@PreparedNewsList,@PreparedNewsList,1,1,1);


	END TRY  
	BEGIN CATCH  
		SELECT @Error = CONCAT('GenerateAgendasList',' ,ErrNo:',CAST(ERROR_NUMBER() AS VARCHAR),' ,Message:',ERROR_MESSAGE()); 
		INSERT INTO [dbo].[SolutionFailList] ([Source],[Message]) VALUES('Database', @Error);
	END CATCH



		--GenerateSystemModules
	BEGIN TRY  
		DECLARE db_cursor13 CURSOR LOCAL FOR SELECT sm.ModuleType, sm.[Name], sm.[Description]
		FROM [dbo].[SystemModuleList] sm
		ORDER BY sm.ModuleType;


		SET @PreparedNewsList = char(13) + '# Seznam ukázkových Modulů Systému,   
		' + char(13) + char(13) + 'Do Systému lze připojit libovolný Software, Libovolná Web Aplikace, či Libovolné Rozšíření,Framework atd.
To z něho Dělá naprostý Unikát. Webové Aplikace se tváří jako část Systému, Aplikace se ovírají Externě ale máte vše po ruce.
a Github nabízí Tisíce hotových řešení. Nestačí že Systém sám je už Systém Generátor a generuje Nové Agendy Skoro sám, ještě lze
připojit naprosto cokoliv. Systém má totiž v sobě na pozadí vlastní Web Server.
' + char(13);

		OPEN db_cursor13  
		FETCH NEXT FROM db_cursor13 INTO @TargetType, @StatusType, @Documentation
		WHILE @@FETCH_STATUS = 0  
		BEGIN 
			
			IF(@PrewTargetType <> @TargetType) BEGIN
				SET @PreparedNewsList += + char(13) + '
---   
' + char(13) + '# ' + @TargetType + '         
' + char(13);
			END
			
			SET @PreparedNewsList +='  **' + @StatusType + '**
' + char(13) + '*' + @Documentation  + '*' + char(13) + '
' + char(13);
			
			SET @PrewTargetType = @TargetType;
			FETCH NEXT FROM db_cursor13 INTO @TargetType, @StatusType, @Documentation
		END;
		CLOSE db_cursor13;
		DEALLOCATE db_cursor13;


		--SAVE GenerateSystemModules
		INSERT INTO [dbo].[DocSrvDocumentationList] ([DocumentationGroupId],[Name], [Description],[Sequence],[MdContent],[HtmlContent],[UserId],[Active],[AutoVersion])
		VALUES(1,'Seznam ukázkových Modulů Systému','Do Systému lze připojit libovolný Software, Libovolná Web Aplikace, či Libovolné Rozšíření,Framework atd.
To z něho Dělá naprostý Unikát. Webové Aplikace se tváří jako část Systému, Aplikace se ovírají Externě ale máte vše po ruce.
a Github nabízí Tisíce hotových řešení. Nestačí že Systém sám je už Systém Generátor a generuje Nové Agendy Skoro sám, ještě lze
připojit naprosto cokoliv. Systém má totiž v sobě na pozadí vlastní Web Server.',40,@PreparedNewsList,@PreparedNewsList,1,1,1);


	END TRY  
	BEGIN CATCH  
		SELECT @Error = CONCAT('GenerateSystemModules',' ,ErrNo:',CAST(ERROR_NUMBER() AS VARCHAR),' ,Message:',ERROR_MESSAGE()); 
		INSERT INTO [dbo].[SolutionFailList] ([Source],[Message]) VALUES('Database', @Error);
	END CATCH


			--GenerateServerModules
	BEGIN TRY  
		DECLARE db_cursor14 CURSOR LOCAL FOR SELECT sm.[InheritedPageType], sm.[Name], sm.[Description]
		FROM [dbo].[ServerModuleAndServiceList] sm
		ORDER BY sm.[InheritedPageType];


		SET @PreparedNewsList = char(13) + '# Seznam Implementovaných Modulů Serveru,   
		' + char(13) + char(13) + 'Do serveru lze zaimplementovat téměř neomezeně funkcionalit. Sám jich už má přehršel.
Je tu ale nová Dynamická agenda kde se nastavují přístupy k zaimplementovaným modulům, nebo je možné tvořit vlastní webové moduly
jako jednostánkové weby pro určitý Účel. ke snadnosti slouží knihovny kódů pomocí kterých tyto moduly můžete doslova Generovat
' + char(13);

		OPEN db_cursor14  
		FETCH NEXT FROM db_cursor14 INTO @TargetType, @StatusType, @Documentation
		WHILE @@FETCH_STATUS = 0  
		BEGIN 
			
			IF(@PrewTargetType <> @TargetType) BEGIN
				SET @PreparedNewsList += + char(13) + '
---   
' + char(13) + '# ' + @TargetType + '         
' + char(13);
			END
			
			SET @PreparedNewsList +='  **' + @StatusType + '**
' + char(13) + '*' + @Documentation  + '*' + char(13) + '
' + char(13);
			
			SET @PrewTargetType = @TargetType;
			FETCH NEXT FROM db_cursor14 INTO @TargetType, @StatusType, @Documentation
		END;
		CLOSE db_cursor14;
		DEALLOCATE db_cursor14;


		--SAVE GenerateServerModules
		INSERT INTO [dbo].[DocSrvDocumentationList] ([DocumentationGroupId],[Name], [Description],[Sequence],[MdContent],[HtmlContent],[UserId],[Active],[AutoVersion])
		VALUES(2,'Seznam Impl. Modulů Serveru','Do serveru lze zaimplementovat téměř neomezeně funkcionalit. Sám jich už má přehršel.
Je tu ale nová Dynamická agenda kde se nastavují přístupy k zaimplementovaným modulům, nebo je možné tvořit vlastní webové moduly
jako jednostánkové weby pro určitý Účel. ke snadnosti slouží knihovny kódů pomocí kterých tyto moduly můžete doslova Generovat',40,@PreparedNewsList,@PreparedNewsList,1,1,1);


	END TRY  
	BEGIN CATCH  
		SELECT @Error = CONCAT('GenerateServerModules',' ,ErrNo:',CAST(ERROR_NUMBER() AS VARCHAR),' ,Message:',ERROR_MESSAGE()); 
		INSERT INTO [dbo].[SolutionFailList] ([Source],[Message]) VALUES('Database', @Error);
	END CATCH


	--GenerateMicroDials
	BEGIN TRY  
		DECLARE db_cursor15 CURSOR LOCAL FOR SELECT sm.ItemsGroup, sm.[Name], sm.[Description]
		FROM [dbo].[SolutionMixedEnumList] sm
		ORDER BY sm.ItemsGroup;


		SET @PreparedNewsList = char(13) + '# Mikročíselníky unikátních Funcionalit,   
		' + char(13) + char(13) + 'Mikročíselník vzniknul jako úsporatabulek pro Výběry z malinkých seznamů. Tyto Seznamy
jsou ale implementované funkcionality, Systému i Serveru to z něho Dělá naprosto mimořádnou Agendu. Zde je Vypsán jeho
Obsah.
' + char(13);

		OPEN db_cursor15  
		FETCH NEXT FROM db_cursor15 INTO @TargetType, @StatusType, @Documentation
		WHILE @@FETCH_STATUS = 0  
		BEGIN 
			
			IF(@PrewTargetType <> @TargetType) BEGIN
				SET @PreparedNewsList += + char(13) + '
---   
' + char(13) + '# ' + @TargetType + '         
' + char(13);
			END
			
			SET @PreparedNewsList +='  **' + @StatusType + '**
' + char(13) + '*' + @Documentation  + '*' + char(13) + '
' + char(13);
			
			SET @PrewTargetType = @TargetType;
			FETCH NEXT FROM db_cursor15 INTO @TargetType, @StatusType, @Documentation
		END;
		CLOSE db_cursor15;
		DEALLOCATE db_cursor15;


		--SAVE GenerateMicroDials
		INSERT INTO [dbo].[DocSrvDocumentationList] ([DocumentationGroupId],[Name], [Description],[Sequence],[MdContent],[HtmlContent],[UserId],[Active],[AutoVersion])
		VALUES(1,'Mikročíselníky unikátní Funkce','Mikročíselník vzniknul jako úspora tabulek pro Výběry z malinkých seznamů. Tyto Seznamy
jsou ale implementované funkcionality, Systému i Serveru to z něho Dělá naprosto mimořádnou Agendu. Zde je Vypsán jeho
Obsah.',70,@PreparedNewsList,@PreparedNewsList,1,1,1);

	SELECT 'Generate AutoDocs From Descriptions Completed' as 'MessageList';

	END TRY  
	BEGIN CATCH  
		SELECT @Error = CONCAT('GenerateMicroDials',' ,ErrNo:',CAST(ERROR_NUMBER() AS VARCHAR),' ,Message:',ERROR_MESSAGE()); 
		INSERT INTO [dbo].[SolutionFailList] ([Source],[Message]) VALUES('Database', @Error);

		SELECT @Error as 'MessageList';
	END CATCH


END;


SP _SpOperationTemplate

			

-- PROCEDURE TEMPLATE WITH LOGGING TO DATABASE FAILLIST
CREATE procedure [dbo].[SpOperationTemplate]
AS
BEGIN 
	DECLARE @Error VarChar(MAX);
	
	--DO PROCESS
	BEGIN TRY  
		
		SELECT 1;

		-- PROCESS COMPLETED
		SELECT 'Process Completed' as 'MessageList';
	END TRY  
	BEGIN CATCH  
		SELECT @Error = CONCAT('ProcessIdentifier',' ,ErrNo:',CAST(ERROR_NUMBER() AS VARCHAR),' ,Message:',ERROR_MESSAGE()); 
		INSERT INTO [dbo].[SolutionFailList] ([Source],[Message]) VALUES('Database', @Error);

		-- PROCESS ERROR
		SELECT @Error as 'MessageList';
	END CATCH


END;


SP ExampleExportJsonFile

			

CREATE PROCEDURE [dbo].[ExampleExportJsonFile](@Json varchar(MAX) OUTPUT)
AS
BEGIN
   ---DECLARE @json VARCHAR (4000);
   SET NOCOUNT ON

   SET @Json = (SELECT [Key],[Value] FROM ServerSettingList FOR JSON PATH);-- '{"DatabaseConnectionString":""';

  /*
  SELECT 
	@Json += CASE 	
		WHEN [Type] = 'bit' AND LOWER(ss.[Value]) = 'false' THEN CONCAT(',"', ss.[Key],'":False' )
		WHEN [Type] = 'bit' AND LOWER(ss.[Value]) = 'true' THEN CONCAT(',"', ss.[Key],'":True')
		WHEN [Type] = 'int' THEN CONCAT(',"', ss.[Key],'":', ss.[Value])
		ELSE CONCAT(',"', ss.[Key],'":"', ss.[Value],'"')
		END 
	FROM ServerSettingList AS ss;
	*/
	--SET @Json += '''';

	SET NOCOUNT OFF

	--SELECT * FROM OpenJson(@Json);
	
END


SP ReportDataset

			
CREATE PROCEDURE [dbo].[ReportDataset]
@TableName varchar(50) = null,
@Sequence int = 0
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

-- Intended for use with param-ed reports.
-- To be called from various My-FyiReporting reports
--   - Various reports with their own layouts are called from VB app after setting Queue with usp_ReportQueue_Push()
--     each report then just contains : 

-- SET FMTONLY OFF;
-- EXEC usp_ReportQueue_Pop @TableName='SomeTablename', @Sequence='10'
-- 

DECLARE @ID int;
DECLARE @NAME varchar(50);
DECLARE @SQL nvarchar(MAX);
DECLARE @FILTER nvarchar(MAX);
DECLARE @SEARCH varchar(50);
DECLARE @SEARCHCOLUMNLIST nvarchar(MAX);
DECLARE @SEARCHFILTERIGNORE bit;
DECLARE @RECID varchar(50);
DECLARE @RECIDFILTERIGNORE bit;

DECLARE @SEPARATEDCOLUMNS nvarchar(MAX);


SELECT Top 1 
  @ID=[Id], 
  @NAME=[Name], 
  @SQL=[Sql], 
  @FILTER=[Filter], 
  @SEARCH=[Search], 
  @SEARCHCOLUMNLIST=[SearchColumnList],
  @SEARCHFILTERIGNORE=[SearchFilterIgnore],
  @RECID=[RecId],
  @RECIDFILTERIGNORE=[RecIdFilterIgnore]
FROM SystemReportQueueList WHERE [TableName]=@TableName AND [Sequence] = @Sequence; 

--PRERARE RECID
IF (@RECID = 0 OR (@RECIDFILTERIGNORE = 1 AND @FILTER <> '1=1')) BEGIN 
	SET @RECID = ''
END ELSE BEGIN
	SET @RECID = CONCAT(' AND Id=',@RECID);
END

--PRERARE SEARCH
IF (@SEARCH = '' OR (@SEARCHFILTERIGNORE = 1 AND @FILTER <> '1=1')) BEGIN
	SET @SEPARATEDCOLUMNS =  '1=1';
END ELSE BEGIN
	SELECT @SEPARATEDCOLUMNS = STRING_AGG (CONCAT(value,' LIKE ',char(39),'%',@SEARCH,'%',char(39)), ' OR ') FROM STRING_SPLIT (@SEARCHCOLUMNLIST, ',');  
END

	SET @SQL = CONCAT(@SQL,' WHERE 1=1 AND (', @FILTER,') AND (', @SEPARATEDCOLUMNS,') ',@RECID); 
	--PRINT @SQL; --FOR Debuging
	EXECUTE sp_executesql @SQL;
END

SP SystemSpGetUserMenuList

			



CREATE procedure [dbo].[SystemSpGetUserMenuList](@userRole varchar(50))
AS
BEGIN 

	SELECT sml.*, sgl.SystemName as GroupName
	FROM [dbo].[SystemMenuList] sml,[dbo].[SystemGroupMenuList] sgl
	WHERE (sml.[AccessRole] LIKE CONCAT(@userRole,',%') OR sml.[AccessRole] LIKE CONCAT('%,',@userRole,',%'))
	AND sgl.Id = sml.GroupId AND sml.Active = 1 AND sgl.Active = 1
	AND sml.NotShowInMenu = 0
	ORDER BY sml.GroupId ASC

END;


SP LicSrvSpCheckUnlockKey

			


CREATE procedure [dbo].[LicSrvSpCheckUnlockKey](@unlockCode varchar(50),@partNumber varchar(50),@ipAddress varchar(50),@allowed bit output)
AS
BEGIN 
	SET NOCOUNT ON;
	-- ALGORITHM EXAMPLE
	-- SELECT CONCAT(CAST((YEAR(GETDATE()) * MONTH(GETDATE()) * DAY(GETDATE())) as varchar(100)),'-SOMETEXT-',CAST(YEAR(GETDATE()) as varchar(4)));


			DECLARE @countValidUnlockKeys INT = 0;DECLARE @counter INT = 0;SET @allowed = 0;

			--LOAD VALIDS AUTO SQL UNLOCKCODES FOR partNumber
			DECLARE @SQLUNLOCK TABLE (Iid int identity(1,1),[Id] int not null, [Name] Varchar(30) not null, [Algorithm] varchar(MAX) not null,[AddressId] int not null,[ItemId] int not null,[LimitActive] bit not null, [ActivationLimit] int null,[UsedCount] int not null)
				INSERT into @SQLUNLOCK SELECT l.Id,l.[Name],l.[Algorithm],l.[AddressId],l.[ItemId],l.[LimitActive],l.[ActivationLimit],l.[UsedCount] FROM [dbo].[LicSrvLicenseAlgorithmList] l,[dbo].[BasicItemList] i WHERE l.[Active] = 1 AND l.ItemId = i.Id
				AND i.[PartNumber] = @partNumber AND i.[Active] = 1 AND ([ValidFrom] IS NULL OR [ValidFrom] < GETDATE()) AND ([ValidTo] IS NULL OR [ValidTo] > GETDATE()) 

				SELECT @countValidUnlockKeys = COUNT([Iid]) FROM @SQLUNLOCK;
				DECLARE @Id int;DECLARE @Name varchar(30);DECLARE @Algorithm nvarchar(MAX);DECLARE @AddressId int;DECLARE @ItemId int;DECLARE @LimitActive int;DECLARE @ActivationLimit int;DECLARE @UsedCount int;
				DECLARE @UNLOCKKEY as varchar(MAX);

			-- CHECKING ALL VALID UNLOCKKEY GENERATORS 
			WHILE @counter < @countValidUnlockKeys BEGIN
				SELECT @Id=[Id],@Name=[Name],@Algorithm=[Algorithm],@AddressId=[AddressId],@ItemId=[ItemId],@Name=[Name],@LimitActive=[LimitActive],@ActivationLimit=[ActivationLimit],@UsedCount=[UsedCount] FROM @SQLUNLOCK WHERE Iid=@counter+1;
				SET @Algorithm= REPLACE(@Algorithm, 'char(39)', '');
				declare @t table(result varchar(max)); insert into @t exec (@Algorithm);SELECT @UNLOCKKEY = result FROM @t;
				IF (@UNLOCKKEY = @unlockCode) BEGIN
					
					IF (@LimitActive = 1 AND @UsedCount + 1 = @ActivationLimit) BEGIN --LAST ACTIVATION
						UPDATE [dbo].[LicSrvLicenseAlgorithmList] SET [UsedCount] = [UsedCount] + 1, Active = 0 WHERE [Id] = @Id;SET @allowed = 1;
					END ELSE IF (@LimitActive = 1 AND @UsedCount + 1 >= @ActivationLimit) BEGIN --WRONG USER DATA
						UPDATE [dbo].[LicSrvLicenseAlgorithmList] SET [Active] = 0  WHERE [Id] = @Id;SET @allowed = 0;
					END ELSE IF (@LimitActive = 1 AND @UsedCount + 1 < @ActivationLimit) BEGIN --USED LICENSE
						UPDATE [dbo].[LicSrvLicenseAlgorithmList] SET [UsedCount] = [UsedCount] + 1 WHERE [Id] = @Id;SET @allowed = 1;
					END ELSE IF (@LimitActive = 0) BEGIN --USED LICENSE
						UPDATE [dbo].[LicSrvLicenseAlgorithmList] SET [UsedCount] = [UsedCount] + 1 WHERE [Id] = @Id;SET @allowed = 1;
					END

					GOTO CHECKDONE;

				END
			   SET @counter += 1;
			END;

CHECKDONE:
		-- GENERATE LICENCE OR WRITE FAILED TRYING
		IF (@allowed = 0) BEGIN
			INSERT INTO [dbo].[LicSrvLicenseActivationFailList] ([IpAddress],[UnlockCode],[PartNumber])
			VALUES (@ipAddress,@unlockCode,@partNumber);
		END ELSE IF (@allowed = 1) BEGIN
			INSERT INTO [dbo].[LicSrvUsedLicenseList] ([IpAddress],[UnlockCode],[AlgorithmName],[PartNumber],[License],[ActivateDate],[AddressId],[ItemId])
			VALUES (@ipAddress,@unlockCode,@Name,@partNumber,NEWID(),GETDATE(),@AddressId,@ItemId);
	END

	RETURN;
END;


Úvod Start -DATABASE-RULE

Vše začíná U databáze. Pravidla určující MultiLogiku v 1 Balíčku. Zde najdete Kompletní Strukturu Aktuální Databáze a Seznam Pravidel, které je obecně dobré dodržovat

1 pravidlo: Každé slovo má Hluboký Význam

Základem je nastavit pevnou a jasnou strukturu a vazby již v databázi

DB - Export Procedur Řešení,

Zde najdete procedury, které stanovují pevnou a jasnou strukturu a vazby již v databázi

TR TR_SolutionEmailerHistoryList

			



CREATE   TRIGGER [dbo].[TR_SolutionEmailerHistoryList] ON [dbo].[SolutionEmailerHistoryList]
FOR INSERT
AS
 
IF EXISTS (SELECT 0 FROM inserted)
BEGIN
	SET NOCOUNT ON;

    IF EXISTS (SELECT 0 FROM deleted)
    BEGIN --UPDATE
		SET NOCOUNT ON;
	END ELSE
		BEGIN -- INSERT
			EXEC [dbo].[SpAutoCleanEmailer];
		END
END


TR TR_DocumentationList

			
CREATE   TRIGGER [dbo].[TR_DocumentationList] ON [dbo].[DocSrvDocumentationList]
FOR INSERT, UPDATE--, DELETE
AS
DECLARE @Operation VARCHAR(15)
 
IF EXISTS (SELECT 0 FROM inserted)
BEGIN
	DECLARE @setActive bit;DECLARE @autoVersion int;DECLARE @RecId int;DECLARE @GroupId int;DECLARE @RecName varchar(150);
	DECLARE @autoRemoveOld bit; DECLARE @UserId int;
	

	SET @autoVersion = 0;SET @setActive = 1;SET @autoRemoveOld = 0;
	SET NOCOUNT ON;

    IF EXISTS (SELECT 0 FROM deleted)
    BEGIN --UPDADE
		SELECT @setActive = ins.[Active] from inserted ins;
		SELECT @RecId = ins.Id from inserted ins;
		SELECT @UserId = ins.UserId from inserted ins;
		SELECT @GroupId = ins.DocumentationGroupId from inserted ins;
		SELECT @RecName = ins.[Name] from inserted ins;

		--GET AutoRemoveSetting
		SELECT @autoRemoveOld = CAST(CAST(SUBSTRING(ss.[Value],1,10) as varchar(10)) as bit) FROM [dbo].[ServerSettingList] ss WHERE ss.[Key] = 'ServerDocsOldAutoRemoveEnabled';

		IF(@setActive = 1) BEGIN
			UPDATE [dbo].DocSrvDocumentationList SET [Active] = 0 WHERE Id <> @RecId AND [Name] = @RecName AND [DocumentationGroupId] = @GroupId; 		
		END

		--AutoRemove Older versions
		IF(@autoRemoveOld = 1) BEGIN
			DELETE FROM  [dbo].DocSrvDocumentationList WHERE Id <> @RecId AND [Name] = @RecName AND [DocumentationGroupId] = @GroupId; 		
		END

	END ELSE
		BEGIN -- INSERT
			SELECT @setActive = ins.[Active] from inserted ins;
			SELECT @RecId = ins.Id from inserted ins;
			SELECT @UserId = ins.UserId from inserted ins;
			SELECT @GroupId = ins.DocumentationGroupId from inserted ins;
			SELECT @RecName = ins.[Name] from inserted ins;

			--GET AutoRemoveSetting
			SELECT @autoRemoveOld = CAST(CAST(SUBSTRING(ss.[Value],1,10) as varchar(10)) as bit) FROM [dbo].[ServerSettingList] ss WHERE ss.[Key] = 'ServerDocsOldAutoRemoveEnabled';

			--AutoVersioning
			SELECT @autoVersion = MAX(d.[AutoVersion]) + 1 FROM [dbo].DocSrvDocumentationList d WHERE d.[Name] = @RecName AND [DocumentationGroupId] = @GroupId;
			IF (@autoVersion = 0 ) BEGIN SET @autoVersion = 1; END
			UPDATE [dbo].DocSrvDocumentationList SET [AutoVersion] = @autoVersion WHERE Id = @RecId AND [DocumentationGroupId] = @GroupId;

			IF(@setActive = 1) BEGIN
				UPDATE [dbo].DocSrvDocumentationList SET [Active] = 0 WHERE Id <> @RecId AND [Name] = @RecName AND [DocumentationGroupId] = @GroupId; 		
			END
			
			--AutoRemove Older versions
			IF(@autoRemoveOld = 1) BEGIN
				DELETE FROM  [dbo].DocSrvDocumentationList WHERE Id <> @RecId AND [Name] = @RecName AND [DocumentationGroupId] = @GroupId; 		
			END
		END
END


TR TR_BranchList

			
CREATE   TRIGGER [dbo].[TR_BranchList] ON [dbo].[BusinessBranchList]
FOR INSERT, UPDATE, DELETE
AS
DECLARE @Operation VARCHAR(15)
 
IF EXISTS (SELECT 0 FROM inserted)
BEGIN
	DECLARE @setActive bit;DECLARE @RecId int;
	SET NOCOUNT ON;

    IF EXISTS (SELECT 0 FROM deleted)
    BEGIN --UPDADE
		SELECT @setActive = ins.[Active] from inserted ins;
		SELECT @RecId = ins.Id from inserted ins;

		IF(@setActive = 1) BEGIN
			UPDATE [dbo].BusinessBranchList SET [Active] = 0 WHERE Id <> @RecId; 		
		END
	END ELSE
		BEGIN -- INSERT
			SELECT @setActive = ins.[Active] from inserted ins;
			SELECT @RecId = ins.Id from inserted ins;

			IF(@setActive = 1) BEGIN
				UPDATE [dbo].BusinessBranchList SET [Active] = 0 WHERE Id <> @RecId; 		
			END
		
		END
END ELSE 
BEGIN --DELETE
	SELECT @setActive = ins.[Active] from deleted ins;
	SELECT @RecId = ins.Id from deleted ins;

	IF(@setActive = 1) BEGIN
		UPDATE [dbo].BusinessBranchList SET [Active] = 1  
		WHERE Id IN(SELECT TOP (1) Id FROM [dbo].BusinessBranchList WHERE Id <> @RecId)
		;
	END
END


TR TR_ServerModuleAndServiceList

			
CREATE   TRIGGER [dbo].[TR_ServerModuleAndServiceList] ON [dbo].[ServerModuleAndServiceList]
FOR INSERT, UPDATE, DELETE
AS
DECLARE @Operation VARCHAR(15)
 
IF EXISTS (SELECT 0 FROM inserted)
BEGIN
	DECLARE @setIsLoginModule bit;DECLARE @RecId int;DECLARE @UrlSubPath VarChar(100);DECLARE @Type VarChar(50);DECLARE @ModulePathExist bit;
	SET NOCOUNT ON;

    IF EXISTS (SELECT 0 FROM deleted)
    BEGIN --UPDADE
		SET @ModulePathExist = 0;
		SELECT @setIsLoginModule = ins.[IsLoginModule] from inserted ins;
		SELECT @RecId = ins.Id from inserted ins;
		SELECT @UrlSubPath = ins.UrlSubPath from inserted ins;
		SELECT @Type = ins.[InheritedLayoutType] from inserted ins;

		--CheckExisting Only One Allowed HTML Module
		IF (@Type = 'FullHtmlPage' OR @Type = 'HtmlBodyOnly') BEGIN
			SELECT @ModulePathExist = 1 FROM [dbo].[ServerModuleAndServiceList] WHERE UrlSubPath = @UrlSubPath;
			IF (@ModulePathExist = 1) BEGIN
				RAISERROR('Can Be Only One Endpoint for Html Module', 16, 1)  
				ROLLBACK TRANSACTION
				RETURN
			END
		END

		--Changing Login Module Set
		IF(@setIsLoginModule = 1) BEGIN
			UPDATE [dbo].ServerModuleAndServiceList SET [IsLoginModule] = 0 WHERE Id <> @RecId; 
		END
	END ELSE
		BEGIN -- INSERT
			SET @ModulePathExist = 0;
			SELECT @setIsLoginModule = ins.[IsLoginModule] from inserted ins;
			SELECT @RecId = ins.Id from inserted ins;
			SELECT @UrlSubPath = ins.UrlSubPath from inserted ins;
			SELECT @Type = ins.[InheritedLayoutType] from inserted ins;

			--CheckExisting Only One Allowed HTML Module
			IF (@Type = 'FullHtmlPage' OR @Type = 'HtmlBodyOnly') BEGIN
				SELECT @ModulePathExist = 1 FROM [dbo].[ServerModuleAndServiceList] WHERE UrlSubPath = @UrlSubPath;
				IF (@ModulePathExist = 1) BEGIN
					RAISERROR('Can Be Only One Endpoint for Html Module', 16, 1)  
					ROLLBACK TRANSACTION
					RETURN
				END
			END

			--Changing Login Module Set
			IF(@setIsLoginModule = 1) BEGIN
				UPDATE [dbo].ServerModuleAndServiceList SET [IsLoginModule] = 0 WHERE Id <> @RecId; 		
			END
		
		END
END ELSE 
BEGIN --DELETE
	SELECT @setIsLoginModule = ins.[IsLoginModule] from deleted ins;
	SELECT @RecId = ins.Id from deleted ins;

	--Changing Login Module Set
	IF(@setIsLoginModule = 1) BEGIN
		UPDATE [dbo].ServerModuleAndServiceList SET [IsLoginModule] = 1  
		WHERE Id IN(SELECT TOP (1) Id FROM [dbo].ServerModuleAndServiceList WHERE Id <> @RecId)
		;
	END
END


TR TR_PaymentMethodList

			
CREATE   TRIGGER [dbo].[TR_PaymentMethodList] ON [dbo].[BusinessPaymentMethodList]
FOR INSERT, UPDATE, DELETE
AS
DECLARE @Operation VARCHAR(15)
 
IF EXISTS (SELECT 0 FROM inserted)
BEGIN
	DECLARE @setDefault bit;DECLARE @RecId int;
	SET NOCOUNT ON;

    IF EXISTS (SELECT 0 FROM deleted)
    BEGIN --UPDADE
		SELECT @setDefault = ins.[Default] from inserted ins;
		SELECT @RecId = ins.Id from inserted ins;

		IF(@setDefault = 1) BEGIN
			UPDATE [dbo].BusinessPaymentMethodList SET [Default] = 0 WHERE Id <> @RecId; 		
		END
	END ELSE
		BEGIN -- INSERT
			SELECT @setDefault = ins.[Default] from inserted ins;
			SELECT @RecId = ins.Id from inserted ins;

			IF(@setDefault = 1) BEGIN
				UPDATE [dbo].BusinessPaymentMethodList SET [Default] = 0 WHERE Id <> @RecId; 		
			END
		
		END
END ELSE 
BEGIN --DELETE
	SELECT @setDefault = ins.[Default] from deleted ins;
	SELECT @RecId = ins.Id from deleted ins;

	IF(@setDefault = 1) BEGIN
		UPDATE [dbo].BusinessPaymentMethodList SET [Default] = 1  
		WHERE Id IN(SELECT TOP (1) Id FROM [dbo].BusinessPaymentMethodList WHERE Id <> @RecId)
		;
	END
END


TR TR_ImageGalleryList

			



CREATE   TRIGGER [dbo].[TR_ImageGalleryList] ON [dbo].[BasicImageGalleryList]
FOR INSERT, UPDATE, DELETE
AS
DECLARE @Operation VARCHAR(15)
 
IF EXISTS (SELECT 0 FROM inserted)
BEGIN
	DECLARE @isPrimary bit;DECLARE @RecId int;DECLARE @HotelId int;
	SET NOCOUNT ON;

    IF EXISTS (SELECT 0 FROM deleted)
    BEGIN --UPDADE
		SELECT @isPrimary = ins.[IsPrimary] from inserted ins;
		SELECT @RecId = ins.Id from inserted ins;

		IF(@isPrimary = 1) BEGIN
			UPDATE [dbo].BasicImageGalleryList SET [IsPrimary] = 0 WHERE Id <> @RecId; 		
		END
	END ELSE
		BEGIN -- INSERT
			SELECT @isPrimary = ins.[IsPrimary] from inserted ins;
			SELECT @RecId = ins.Id from inserted ins;

			IF(@isPrimary = 1) BEGIN
				UPDATE [dbo].BasicImageGalleryList SET [IsPrimary] = 0 WHERE Id <> @RecId; 		
			END
		
		END
END ELSE 
BEGIN --DELETE
	SELECT @isPrimary = ins.[IsPrimary] from deleted ins;
	SELECT @RecId = ins.Id from deleted ins;

	IF(@isPrimary = 1) BEGIN
		UPDATE [dbo].BasicImageGalleryList SET [IsPrimary] = 1  
		WHERE Id IN(SELECT TOP (1) Id FROM [dbo].BasicImageGalleryList WHERE Id <> @RecId)
		;
	END
END


TR TR_MaturityList

			
CREATE   TRIGGER [dbo].[TR_MaturityList] ON [dbo].[BusinessMaturityList]
FOR INSERT, UPDATE, DELETE
AS
DECLARE @Operation VARCHAR(15)
 
IF EXISTS (SELECT 0 FROM inserted)
BEGIN
	DECLARE @setDefault bit;DECLARE @RecId int;
	SET NOCOUNT ON;

    IF EXISTS (SELECT 0 FROM deleted)
    BEGIN --UPDADE
		SELECT @setDefault = ins.[Default] from inserted ins;
		SELECT @RecId = ins.Id from inserted ins;

		IF(@setDefault = 1) BEGIN
			UPDATE [dbo].BusinessMaturityList SET [Default] = 0 WHERE Id <> @RecId; 		
		END
	END ELSE
		BEGIN -- INSERT
			SELECT @setDefault = ins.[Default] from inserted ins;
			SELECT @RecId = ins.Id from inserted ins;

			IF(@setDefault = 1) BEGIN
				UPDATE [dbo].BusinessMaturityList SET [Default] = 0 WHERE Id <> @RecId; 		
			END
		
		END
END ELSE 
BEGIN --DELETE
	SELECT @setDefault = ins.[Default] from deleted ins;
	SELECT @RecId = ins.Id from deleted ins;

	IF(@setDefault = 1) BEGIN
		UPDATE [dbo].BusinessMaturityList SET [Default] = 1  
		WHERE Id IN(SELECT TOP (1) Id FROM [dbo].BusinessMaturityList WHERE Id <> @RecId)
		;
	END
END


TR TR_UserList

			
CREATE   TRIGGER [dbo].[TR_UserList] ON dbo.SolutionUserList
FOR INSERT
AS
 
IF EXISTS (SELECT 0 FROM inserted)
BEGIN
	DECLARE @UserId int;

	SET NOCOUNT ON;

    IF EXISTS (SELECT 0 FROM deleted)
    BEGIN --UPDADE

		SELECT @UserId = ins.Id from inserted ins;

	END ELSE
		BEGIN -- INSERT

			SELECT @UserId = ins.Id from inserted ins;
			
			INSERT INTO [dbo].[SystemParameterList]([UserId],[SystemName],[Value],[Type],[Description])
			SELECT @UserId, pa.[SystemName],pa.[Value],pa.[Type],pa.[Description]
			FROM [dbo].[SystemParameterList] pa
			WHERE pa.UserId IS NULL;

		END
END /* ELSE 
BEGIN --DELETE
	SELECT @setActive = ins.[Active] from deleted ins;
	SELECT @RecId = ins.Id from deleted ins;
	SELECT @RecName = ins.[Name] from deleted ins;

	IF(@setActive = 1) BEGIN
		UPDATE [dbo].DocumentationList SET [Active] = 1 
		WHERE Id IN(SELECT TOP (1) MAX(d.Id) FROM [dbo].DocumentationList d WHERE d.Id <> @RecId AND d.[Name] = @RecName)
		;
	END
END
*/


TR TR_PaymentStatusList

			
CREATE   TRIGGER [dbo].[TR_PaymentStatusList] ON [dbo].[BusinessPaymentStatusList]
FOR INSERT, UPDATE, DELETE
AS
DECLARE @Operation VARCHAR(15)
 
IF EXISTS (SELECT 0 FROM inserted)
BEGIN
	DECLARE @setDefault bit;DECLARE @RecId int;
	SET NOCOUNT ON;

    IF EXISTS (SELECT 0 FROM deleted)
    BEGIN --UPDADE
		SELECT @setDefault = ins.[Default] from inserted ins;
		SELECT @RecId = ins.Id from inserted ins;

		IF(@setDefault = 1) BEGIN
			UPDATE [dbo].BusinessPaymentStatusList SET [Default] = 0 WHERE Id <> @RecId; 		
		END
	END ELSE
		BEGIN -- INSERT
			SELECT @setDefault = ins.[Default] from inserted ins;
			SELECT @RecId = ins.Id from inserted ins;

			IF(@setDefault = 1) BEGIN
				UPDATE [dbo].BusinessPaymentStatusList SET [Default] = 0 WHERE Id <> @RecId; 		
			END
		
		END
END ELSE 
BEGIN --DELETE
	SELECT @setDefault = ins.[Default] from deleted ins;
	SELECT @RecId = ins.Id from deleted ins;

	IF(@setDefault = 1) BEGIN
		UPDATE [dbo].BusinessPaymentStatusList SET [Default] = 1  
		WHERE Id IN(SELECT TOP (1) Id FROM [dbo].BusinessPaymentStatusList WHERE Id <> @RecId)
		;
	END
END


TR TR_PaymentStatusListCreditNote

			
CREATE   TRIGGER [dbo].[TR_PaymentStatusListCreditNote] ON [dbo].[BusinessPaymentStatusList]
FOR INSERT, UPDATE, DELETE
AS
DECLARE @Operation VARCHAR(15)
 
IF EXISTS (SELECT 0 FROM inserted)
BEGIN
	DECLARE @setCreditNote bit;DECLARE @RecId int;
	SET NOCOUNT ON;

    IF EXISTS (SELECT 0 FROM deleted)
    BEGIN --UPDADE
		SELECT @setCreditNote = ins.[CreditNote] from inserted ins;
		SELECT @RecId = ins.Id from inserted ins;

		IF(@setCreditNote = 1) BEGIN
			UPDATE [dbo].BusinessPaymentStatusList SET [CreditNote] = 0 WHERE Id <> @RecId; 		
		END
	END ELSE
		BEGIN -- INSERT
			SELECT @setCreditNote = ins.[CreditNote] from inserted ins;
			SELECT @RecId = ins.Id from inserted ins;

			IF(@setCreditNote = 1) BEGIN
				UPDATE [dbo].BusinessPaymentStatusList SET [CreditNote] = 0 WHERE Id <> @RecId; 		
			END
		
		END
END ELSE 
BEGIN --DELETE
	SELECT @setCreditNote = ins.[CreditNote] from deleted ins;
	SELECT @RecId = ins.Id from deleted ins;

	IF(@setCreditNote = 1) BEGIN
		UPDATE [dbo].BusinessPaymentStatusList SET [CreditNote] = 1  
		WHERE Id IN(SELECT TOP (1) Id FROM [dbo].BusinessPaymentStatusList WHERE Id <> @RecId)
		;
	END
END


TR TR_PaymentStatusListReceipt

			
CREATE   TRIGGER [dbo].[TR_PaymentStatusListReceipt] ON [dbo].[BusinessPaymentStatusList]
FOR INSERT, UPDATE, DELETE
AS
DECLARE @Operation VARCHAR(15)
 
IF EXISTS (SELECT 0 FROM inserted)
BEGIN
	DECLARE @setReceipt bit;DECLARE @RecId int;
	SET NOCOUNT ON;

    IF EXISTS (SELECT 0 FROM deleted)
    BEGIN --UPDADE
		SELECT @setReceipt = ins.[Receipt] from inserted ins;
		SELECT @RecId = ins.Id from inserted ins;

		IF(@setReceipt = 1) BEGIN
			UPDATE [dbo].BusinessPaymentStatusList SET [Receipt] = 0 WHERE Id <> @RecId; 		
		END
	END ELSE
		BEGIN -- INSERT
			SELECT @setReceipt = ins.[Receipt] from inserted ins;
			SELECT @RecId = ins.Id from inserted ins;

			IF(@setReceipt = 1) BEGIN
				UPDATE [dbo].BusinessPaymentStatusList SET [Receipt] = 0 WHERE Id <> @RecId; 		
			END
		
		END
END ELSE 
BEGIN --DELETE
	SELECT @setReceipt = ins.[Receipt] from deleted ins;
	SELECT @RecId = ins.Id from deleted ins;

	IF(@setReceipt = 1) BEGIN
		UPDATE [dbo].BusinessPaymentStatusList SET [Receipt] = 1  
		WHERE Id IN(SELECT TOP (1) Id FROM [dbo].BusinessPaymentStatusList WHERE Id <> @RecId)
		;
	END
END


TR TR_WebMenuList

			

CREATE   TRIGGER [dbo].[TR_WebMenuList] ON [dbo].[WebMenuList]
FOR INSERT, UPDATE, DELETE
AS
DECLARE @Operation VARCHAR(15)
 
IF EXISTS (SELECT 0 FROM inserted)
BEGIN
	DECLARE @setDefault bit;DECLARE @RecId int;
	SET NOCOUNT ON;

    IF EXISTS (SELECT 0 FROM deleted)
    BEGIN --UPDADE
		SELECT @setDefault = ins.[Default] from inserted ins;
		SELECT @RecId = ins.Id from inserted ins;

		IF(@setDefault = 1) BEGIN
			UPDATE [dbo].WebMenuList SET [Default] = 0 WHERE Id <> @RecId; 		
		END
	END ELSE
		BEGIN -- INSERT
			SELECT @setDefault = ins.[Default] from inserted ins;
			SELECT @RecId = ins.Id from inserted ins;

			IF(@setDefault = 1) BEGIN
				UPDATE [dbo].WebMenuList SET [Default] = 0 WHERE Id <> @RecId; 		
			END
		
		END
END/* ELSE 
BEGIN --DELETE
	SELECT @setDefault = ins.[Default] from deleted ins;
	SELECT @RecId = ins.Id from deleted ins;

	IF(@setDefault = 1) BEGIN
		UPDATE [dbo].WebMenuList SET [Default] = 1  
		WHERE Id IN(SELECT TOP (1) Id FROM [dbo].WebMenuList WHERE Id <> @RecId)
		;
	END
END*/


TR TR_SystemTranslationList

			

CREATE   TRIGGER [dbo].[TR_SystemTranslationList] ON [dbo].[SystemTranslationList]
FOR INSERT
AS
 
IF EXISTS (SELECT 0 FROM inserted)
BEGIN
	DECLARE @UserId int;DECLARE @RecId int;
	DECLARE @AutoFillDictionaries bit;
	DECLARE @SystemName varchar(50);DECLARE @DescriptionCz varchar(500);DECLARE @DescriptionEn varchar(500);
	SET @AutoFillDictionaries = 1;

	SET NOCOUNT ON;
    IF NOT EXISTS (SELECT 0 FROM deleted)
		BEGIN -- INSERT
			
			SELECT @RecId = ins.Id from inserted ins;
			SELECT @UserId = ins.UserId from inserted ins;
			SELECT @SystemName = ins.SystemName from inserted ins;
			SELECT @DescriptionCz = ins.DescriptionCz from inserted ins;
			SELECT @DescriptionEn = ins.DescriptionEn from inserted ins;
			
			--GET AutoFilling Configuration
			SELECT @AutoFillDictionaries = CAST(CAST(SUBSTRING(p.[Value],1,10) as varchar(10)) as bit) FROM [dbo].[SystemParameterList] p WHERE p.[UserId] IS NULL AND p.[SystemName] = 'ServerTranslationAutoFillEnabled';

			IF (@AutoFillDictionaries = 1) BEGIN
				IF(@DescriptionCz IS NULL OR LEN(@DescriptionCz) = 0) BEGIN SET @DescriptionCz = @SystemName; END
				IF(@DescriptionEn IS NULL OR LEN(@DescriptionEn) = 0) BEGIN SET @DescriptionEn = @SystemName; END
				UPDATE dbo.SystemTranslationList SET [DescriptionCz] = @DescriptionCz, [DescriptionEn] = @DescriptionEn WHERE Id = @RecId;
			END
		END
END


TR TR_VatList

			
CREATE   TRIGGER [dbo].[TR_VatList] ON [dbo].[BasicVatList]
FOR INSERT, UPDATE, DELETE
AS
DECLARE @Operation VARCHAR(15)
 
IF EXISTS (SELECT 0 FROM inserted)
BEGIN
	DECLARE @setDefault bit;DECLARE @RecId int;
	SET NOCOUNT ON;

    IF EXISTS (SELECT 0 FROM deleted)
    BEGIN --UPDADE
		SELECT @setDefault = ins.[Default] from inserted ins;
		SELECT @RecId = ins.Id from inserted ins;

		IF(@setDefault = 1) BEGIN
			UPDATE [dbo].BasicVatList SET [Default] = 0 WHERE Id <> @RecId; 		
		END
	END ELSE
		BEGIN -- INSERT
			SELECT @setDefault = ins.[Default] from inserted ins;
			SELECT @RecId = ins.Id from inserted ins;

			IF(@setDefault = 1) BEGIN
				UPDATE [dbo].BasicVatList SET [Default] = 0 WHERE Id <> @RecId; 		
			END
		
		END
END ELSE 
BEGIN --DELETE
	SELECT @setDefault = ins.[Default] from deleted ins;
	SELECT @RecId = ins.Id from deleted ins;

	IF(@setDefault = 1) BEGIN
		UPDATE [dbo].BasicVatList SET [Default] = 1  
		WHERE Id IN(SELECT TOP (1) Id FROM [dbo].BasicVatList WHERE Id <> @RecId)
		;
	END
END


TR TR_WarehouseList

			
CREATE   TRIGGER [dbo].[TR_WarehouseList] ON [dbo].[BusinessWarehouseList]
FOR INSERT, UPDATE, DELETE
AS
DECLARE @Operation VARCHAR(15)
 
IF EXISTS (SELECT 0 FROM inserted)
BEGIN
	DECLARE @setDefault bit;DECLARE @RecId int;
	SET NOCOUNT ON;

    IF EXISTS (SELECT 0 FROM deleted)
    BEGIN --UPDADE
		SELECT @setDefault = ins.[Default] from inserted ins;
		SELECT @RecId = ins.Id from inserted ins;

		IF(@setDefault = 1) BEGIN
			UPDATE [dbo].BusinessWarehouseList SET [Default] = 0 WHERE Id <> @RecId; 		
		END
	END ELSE
		BEGIN -- INSERT
			SELECT @setDefault = ins.[Default] from inserted ins;
			SELECT @RecId = ins.Id from inserted ins;

			IF(@setDefault = 1) BEGIN
				UPDATE [dbo].BusinessWarehouseList SET [Default] = 0 WHERE Id <> @RecId; 		
			END
		
		END
END ELSE 
BEGIN --DELETE
	SELECT @setDefault = ins.[Default] from deleted ins;
	SELECT @RecId = ins.Id from deleted ins;

	IF(@setDefault = 1) BEGIN
		UPDATE [dbo].BusinessWarehouseList SET [Default] = 1  
		WHERE Id IN(SELECT TOP (1) Id FROM [dbo].BusinessWarehouseList WHERE Id <> @RecId)
		;
	END
END


TR TR_ReportList

			
CREATE   TRIGGER [dbo].[TR_ReportList] ON [dbo].[SystemReportList]
FOR INSERT, UPDATE, DELETE
AS
DECLARE @Operation VARCHAR(15)
 
IF EXISTS (SELECT 0 FROM inserted)
BEGIN
	DECLARE @setDefault bit;DECLARE @RecId int;
	SET NOCOUNT ON;

    IF EXISTS (SELECT 0 FROM deleted)
    BEGIN /* UPDADE */
		SELECT @setDefault = ins.[Default] from inserted ins;
		SELECT @RecId = ins.Id from inserted ins;

		IF(@setDefault = 1) BEGIN
			UPDATE [dbo].SystemReportList SET [Default] = 0 WHERE Id <> @RecId; 		
		END
	END ELSE
		BEGIN /* INSERT */
			SELECT @setDefault = ins.[Default] from inserted ins;
			SELECT @RecId = ins.Id from inserted ins;

			IF(@setDefault = 1) BEGIN
				UPDATE [dbo].SystemReportList SET [Default] = 0 WHERE Id <> @RecId; 		
			END
		
		END
END ELSE 
BEGIN /* DELETE */
	SELECT @setDefault = ins.[Default] from deleted ins;
	SELECT @RecId = ins.Id from deleted ins;

	IF(@setDefault = 1) BEGIN
		UPDATE [dbo].SystemReportList SET [Default] = 1  
		WHERE Id IN(SELECT TOP (1) Id FROM [dbo].SystemReportList WHERE Id <> @RecId)
		;
	END
END


TR TR_UnitList

			
CREATE   TRIGGER [dbo].[TR_UnitList] ON [dbo].[BasicUnitList]
FOR INSERT, UPDATE, DELETE
AS
DECLARE @Operation VARCHAR(15)
 
IF EXISTS (SELECT 0 FROM inserted)
BEGIN
	DECLARE @setDefault bit;DECLARE @RecId int;
	SET NOCOUNT ON;

    IF EXISTS (SELECT 0 FROM deleted)
    BEGIN --UPDADE
		SELECT @setDefault = ins.[Default] from inserted ins;
		SELECT @RecId = ins.Id from inserted ins;

		IF(@setDefault = 1) BEGIN
			UPDATE [dbo].BasicUnitList SET [Default] = 0 WHERE Id <> @RecId; 		
		END
	END ELSE
		BEGIN -- INSERT
			SELECT @setDefault = ins.[Default] from inserted ins;
			SELECT @RecId = ins.Id from inserted ins;

			IF(@setDefault = 1) BEGIN
				UPDATE [dbo].BasicUnitList SET [Default] = 0 WHERE Id <> @RecId; 		
			END
		
		END
END ELSE 
BEGIN --DELETE
	SELECT @setDefault = ins.[Default] from deleted ins;
	SELECT @RecId = ins.Id from deleted ins;

	IF(@setDefault = 1) BEGIN
		UPDATE [dbo].BasicUnitList SET [Default] = 1  
		WHERE Id IN(SELECT TOP (1) Id FROM [dbo].BasicUnitList WHERE Id <> @RecId)
		;
	END
END


TR TR_WebDocumentationList

			
CREATE   TRIGGER [dbo].[TR_WebDocumentationList] ON [dbo].[WebDocumentationList]
FOR INSERT, UPDATE--, DELETE
AS
DECLARE @Operation VARCHAR(15)
 
IF EXISTS (SELECT 0 FROM inserted)
BEGIN
	DECLARE @setActive bit;DECLARE @autoVersion int;DECLARE @RecId int;DECLARE @RecName varchar(150);
	DECLARE @autoRemoveOld bit; DECLARE @UserId int;
	

	SET @autoVersion = 0;SET @setActive = 1;SET @autoRemoveOld = 0;
	SET NOCOUNT ON;

    IF EXISTS (SELECT 0 FROM deleted)
    BEGIN --UPDADE
		SELECT @setActive = ins.[Active] from inserted ins;
		SELECT @RecId = ins.Id from inserted ins;
		SELECT @UserId = ins.UserId from inserted ins;
		SELECT @RecName = ins.[Name] from inserted ins;

		--GET AutoRemoveSetting
		SELECT @autoRemoveOld = CAST(CAST(SUBSTRING(p.[Value],1,10) as varchar(10)) as bit) FROM [dbo].[SystemParameterList] p WHERE p.[UserId] = @UserId AND p.[SystemName] = 'WebDocsOldAutoRemoveEnabled';

		IF(@setActive = 1) BEGIN
			UPDATE [dbo].WebDocumentationList SET [Active] = 0 WHERE Id <> @RecId AND [Name] = @RecName; 		
		END

		--AutoRemove Older versions
		IF(@autoRemoveOld = 1) BEGIN
			DELETE FROM  [dbo].WebDocumentationList WHERE Id <> @RecId AND [Name] = @RecName; 		
		END

	END ELSE
		BEGIN -- INSERT
			SELECT @setActive = ins.[Active] from inserted ins;
			SELECT @RecId = ins.Id from inserted ins;
			SELECT @UserId = ins.UserId from inserted ins;
			SELECT @RecName = ins.[Name] from inserted ins;

			--GET AutoRemoveSetting
			SELECT @autoRemoveOld = CAST(CAST(SUBSTRING(p.[Value],1,10) as varchar(10)) as bit) FROM [dbo].[SystemParameterList] p WHERE p.[UserId] = @UserId AND p.[SystemName] = 'WebDocsOldAutoRemoveEnabled';

			--AutoVersioning
			SELECT @autoVersion = MAX(d.[AutoVersion]) + 1 FROM [dbo].WebDocumentationList d WHERE d.[Name] = @RecName;
			IF (@autoVersion = 0 ) BEGIN SET @autoVersion = 1; END
			UPDATE [dbo].WebDocumentationList SET [AutoVersion] = @autoVersion WHERE Id = @RecId;

			IF(@setActive = 1) BEGIN
				UPDATE [dbo].WebDocumentationList SET [Active] = 0 WHERE Id <> @RecId AND [Name] = @RecName; 		
			END
			
			--AutoRemove Older versions
			IF(@autoRemoveOld = 1) BEGIN
				DELETE FROM  [dbo].WebDocumentationList WHERE Id <> @RecId AND [Name] = @RecName; 		
			END
		END
END /* ELSE 
BEGIN --DELETE
	SELECT @setActive = ins.[Active] from deleted ins;
	SELECT @RecId = ins.Id from deleted ins;
	SELECT @RecName = ins.[Name] from deleted ins;

	IF(@setActive = 1) BEGIN
		UPDATE [dbo].WebDocumentationList SET [Active] = 1 
		WHERE Id IN(SELECT TOP (1) MAX(d.Id) FROM [dbo].WebDocumentationList d WHERE d.Id <> @RecId AND d.[Name] = @RecName)
		;
	END
END
*/


TR TR_CurrencyList

			
CREATE   TRIGGER [dbo].[TR_CurrencyList] ON [dbo].[BasicCurrencyList]
FOR INSERT, UPDATE, DELETE
AS
DECLARE @Operation VARCHAR(15)
 
IF EXISTS (SELECT 0 FROM inserted)
BEGIN
	DECLARE @setDefault bit;DECLARE @RecId int;
	SET NOCOUNT ON;

    IF EXISTS (SELECT 0 FROM deleted)
    BEGIN --UPDADE
		SELECT @setDefault = ins.[Default] from inserted ins;
		SELECT @RecId = ins.Id from inserted ins;

		IF(@setDefault = 1) BEGIN
			UPDATE [dbo].BasicCurrencyList SET [Default] = 0 WHERE Id <> @RecId; 		
		END
	END ELSE
		BEGIN -- INSERT
			SELECT @setDefault = ins.[Default] from inserted ins;
			SELECT @RecId = ins.Id from inserted ins;

			IF(@setDefault = 1) BEGIN
				UPDATE [dbo].BasicCurrencyList SET [Default] = 0 WHERE Id <> @RecId; 		
			END
		
		END
END ELSE 
BEGIN --DELETE
	SELECT @setDefault = ins.[Default] from deleted ins;
	SELECT @RecId = ins.Id from deleted ins;

	IF(@setDefault = 1) BEGIN
		UPDATE [dbo].BasicCurrencyList SET [Default] = 1  
		WHERE Id IN(SELECT TOP (1) Id FROM [dbo].BasicCurrencyList WHERE Id <> @RecId)
		;
	END
END


TR TR_ParameterList

			
CREATE   TRIGGER [dbo].[TR_ParameterList] ON dbo.SystemParameterList
FOR INSERT
AS
 
IF EXISTS (SELECT 0 FROM inserted)
BEGIN
	DECLARE @UserId int;DECLARE @RecId int;DECLARE @SystemName varchar(50);	DECLARE @Value varchar(max);	
	DECLARE @Type varchar(20); DECLARE @Description varchar(MAX);

	SET NOCOUNT ON;

    IF EXISTS (SELECT 0 FROM deleted)
    BEGIN --UPDADE
		
		SELECT @UserId = ins.UserId from inserted ins;
		
	END ELSE
		BEGIN -- INSERT

			SELECT @RecId = ins.[Id] from inserted ins;
			SELECT @UserId = ins.[UserId] from inserted ins;
			SELECT @SystemName = ins.[SystemName] from inserted ins;
			SELECT @Type  = ins.[Type] from inserted ins;

			SELECT @Value = CONVERT(varchar(MAX),p.[Value]), @Description = CONVERT(varchar(MAX),p.[Description]) from [dbo].[SystemParameterList] p WHERE p.Id =  @RecId ;
			
			IF (@UserId IS NULL) BEGIN
			
				INSERT INTO [dbo].[SystemParameterList]([UserId],[SystemName],[Value],[Type],[Description])
				SELECT DISTINCT pa.UserId, @SystemName, @Value, @Type, @Description
				FROM [dbo].[SystemParameterList] pa
				WHERE pa.UserId IS NOT NULL;
				
			END
		END
END /* ELSE 
BEGIN --DELETE
	SELECT @UserId = ins.[UserId] from inserted ins;
	SELECT @SystemName = ins.[SystemName] from inserted ins;
	
	IF (@UserId IS NULL) BEGIN
		DELETE FROM [dbo].[SystemParameterList] WHERE [SystemName] = @SystemName;
	END
END*/


Úvod Start -DATABASE-RULE

Vše začíná U databáze. Pravidla určující MultiLogiku v 1 Balíčku. Zde najdete Kompletní Strukturu Aktuální Databáze a Seznam Pravidel, které je obecně dobré dodržovat

1 pravidlo: Každé slovo má Hluboký Význam

Složené Datapohledy a Funkce

DB - Export Views a Funkcí Řešení,

Zde najdete složené Datapohledy a Funkce

FNfnGetFileName

(
    @fullpath nvarchar(1024)
) 
RETURNS nvarchar(1024)
AS
BEGIN
    IF(CHARINDEX('\', @fullpath) > 0)
       SELECT @fullpath = RIGHT(@fullpath, CHARINDEX('\', REVERSE(@fullpath)) -1)
       RETURN @fullpath
END

FN Fn_SplitString

(
    @string    nvarchar(max),
    @delimiter nvarchar(max)
)
/*
    The same as STRING_SPLIT for compatibility level < 130
    https://docs.microsoft.com/en-us/sql/t-sql/functions/string-split-transact-sql?view=sql-server-ver15
*/
RETURNS TABLE AS RETURN
(
    SELECT 
      --ROW_NUMBER ( ) over(order by (select 0))                            AS id     --  intuitive, but not correect
        Split.a.value('let $n := . return count(../*[. << $n]) + 1', 'int') AS id
      , Split.a.value('.', 'NVARCHAR(MAX)')                                 AS value
    FROM
    (
        SELECT CAST('<X>'+REPLACE(@string, @delimiter, '</X><X>')+'</X>' AS XML) AS String
    ) AS a
    CROSS APPLY String.nodes('/X') AS Split(a)
)

VIEW ProviderViewGeneratedToolRatingList

AS
SELECT        Name, AVG(Rating) AS Rating, COUNT(Id) AS CountRating,
                             (SELECT        COUNT(Id) AS Expr1
                               FROM            dbo.ProviderGeneratedToolList AS gt
                               WHERE        (Name = g.Name)) AS TotalCount
FROM            dbo.ProviderGeneratedToolList AS g
WHERE        (Rating IS NOT NULL)
GROUP BY Name


VIEW BasicViewAttachmentList

AS
SELECT        TOP (100) PERCENT AL.Id, AL.FileName, IL.PartNumber, AL.TimeStamp
FROM            dbo.BasicAttachmentList AS AL LEFT OUTER JOIN
                         dbo.BasicItemList AS IL ON AL.ParentId = IL.Id AND AL.ParentType = 'ITEM'
ORDER BY AL.FileName


Úvod EIC-Dev Pravidla

EASY IT CENTER Pravidla, návody a řešení Platná pro Projekt EIC

Rady A Návody, jak nasadit řešení na různé OS

EASY-SYSTEM-Builder & EASY-DATA-Center & Visual Studio Rady

Pro snadný Vývoj, Pořizování Obtidsků Databáze a automatické Generování DB Modelu
psaní Statických MD Dokumentací,

si nainstalujte Tyto Doplňky:

BundlerMinifier      - Minifikace souborů Projektu    
EntityFramework Core Scafolding - Vytvoření Modelu DB v Projektu 1 kliknutím    
MarkdownEditor  -  Visual Studio MarkDown Editor    
Mermaid              - Visual Studio mermaid editor    
Multi-Language   - Visual Studio MultiLanguage Rozšířená Podpora    
Preview-HTML     - Náhled HTML    
    

Vytvoření Linux SLužby EIC serveru a její Ovládání

Soubory Služeb na Debian jsou ve složce: /lib/systemd/system
Nakopírujte soubor Služby z Data/InstallHelp/ do této složky a upravte
Aktivujte Službu a můžete nastartovat

  • Přehled příkazů služby EIC serveru
systemctl enable dotnet-TABackend-service.service    
systemctl start dotnet-TABackend-service.service    
systemctl status dotnet-TABackend-service.service    
systemctl stop dotnet-TABackend-service.service    
  • Linux přímé spuštění pomocí dotnet dll příkazu
dotnet EasyITCenter.dll    

WINDOWS OS Nápovědy a Tipy

  • Install Backend 'EXE' file as Windows service by SC/InstalUtil/ utility
  • Windows Service utilities and Service control from command Line examples are in 'WinServiceUtilities' folder

Instalace EIC serveru na Windows Krok za Krokem

Je jednoduchá pomocí Exe Instalátoru

  1. Nainstalujte si MSSQL Express 2019 a Vyšší
  2. Importujte databázi z EasyITCenter.bak. souboru
  3. Spusťte Instalátor EIC Serveru
  4. Zkuste spustit EIC z nainstalované složky pomocí Exe Souboru
    pro kontrolu připojení k databázi. Konfigurační soubor připojení k DB najdete v ProgramData/EasyITcenter/config.json
  5. Spusťte Windows Službu EasyITcenter

Detailní popis nasazení Databáze je popsán v Instalaci na Linux Debian


Instalace EIC serveru na Linux Debian 11x64 Krok za Krokem

Zde je přehled linuxových příkazů krok za krokem
pro instalaci EIC na linux

  1. Instalace MSSQL krok za krokem
    
sudo apt install gnupg2 apt-transport-https wget curl.    
    
wget -q -O- https://packages.microsoft.com/keys/microsoft.asc | \    
    gpg --dearmor | sudo tee /usr/share/keyrings/microsoft.gpg > /dev/null 2>&1    
    
echo "deb [signed-by=/usr/share/keyrings/microsoft.gpg arch=amd64,armhf,arm64] https://packages.microsoft.com/ubuntu/20.04/mssql-server-2019 focal main" | \    
    sudo tee /etc/apt/sources.list.d/mssql-server-2019.list    
    
sudo apt update    
sudo apt install mssql-server    
sudo /opt/mssql/bin/mssql-conf setup    
sudo systemctl is-enabled mssql-server    
sudo systemctl status mssql-server    

Nyní se můžete připojit k MSSQL serveru vzdáleně z MSSQL Management Studio
a naimportovat Databázi ze souboru EasyITCenter.bak

a to takto:

  1. Vytvořte Databázi EasyITCenter
  2. nastavte Recovery model Simple, Collation CZECH_CI_AS
  3. vytvořte MSSQL uživatele easyitcenter s heslem easyitcenter
  4. Nahrajte EasyITCenter.bak na server do nějaké složky
  5. Obnovte Databázi EasyITCenter a zvolte EasyITCenter.bak
  6. Smažte uživatele easyitcenter ze SECURITY databáze EasyITCenter
  7. v Programibility/Stored Procedures Spusťte proceduru SpTaskDB_SETRIGHTS
    znovu se vam přidá a nastavi se všemi právy - READ/WRITE/EXECUTE

HOTOVO Tím je hotovo nasazení MSSQL a Databáze
Vyzkoušejte si připojení


Linux Instalace Nástrojů pro správu serveru

  • zde jsou příkazy na instalaci pomocných nástrojů pro správu linuxového serveru
    
sudo apt-get install mc           -  Instalace File Manažera    
  • Instalace Softwarového Firewalu
sudo apt install ufw    
sudo ufw allow OpenSSH    
sudo ufw allow 1433/tcp    
sudo ufw enable    
sudo ufw status    
    
  • Instalace MSSQL Nástrojů sqlcmd, atd
echo "deb [signed-by=/usr/share/keyrings/microsoft.gpg arch=amd64,armhf,arm64] https://packages.microsoft.com/ubuntu/20.04/prod focal main" | \    
    sudo tee /etc/apt/sources.list.d/prod.list    
    
sudo apt update    
sudo apt install mssql-tools unixodbc-dev    
ls /opt/mssql-tools/bin    
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc    
    
source ~/.bashrc    
echo $PATH    
    
which sqlcmd    
which bcp    
    

HOTOVO

můžete si vyzkoušet připojení z CMD

    
sqlcmd -S localhost -U SA -p    
    

MarkDown Item Template

    

Úvod EIC - Dokumentace Projektu

EasyITcenter Universální řešení serverů IT světa v 1 Globálním Balíčku Modulární Server s možností neomezeného a přesto extermně jednoduchého vývoje všemi směry Ideální Centrální Správa sítí, strojů, IT a všeho co si dovedete prtředstavit. Máte Otázky? neváhejte nám zavolat Základní Struktura Projektu

EASY-SYSTEM-Builder & EASY-DATA-Center Nápověda pro Visual Studio


Migrace mezi typy databází

  • Nainstalujte SW 'Mysql WorkBench'
  • spustit migrace

Nápověda: https://severalnines.com/blog/how-migrate-mssql-mysql/
SW: https://dev.mysql.com/downloads/file/?id=517975



Aplikace pro Windows a nástroje Windows

  • v nabídce Start Windows Kits
  • cmd Obnovit nastavení obchodu
wsreset.exe    

Více stovek nástrojů a nápadů Github Soucre se nepoužívá

  • Sto hotových nástrojů je zdarma pro rychlou implementaci
  • Jednoduchá logika kódu s nejlepšími pravidly systémové logiky Minimalizujte potřeby pro implementaci zpráv
  • Příklad: https://github.com/search?q=wpf+tool&type=repositories
  • Levné a rychlé zprávy o implementaci Příklad: Vzdálená podpora RDP 1 den, HTML editor pro správu webových stránek: 2 dny
  • Google vyřeší nemožný problém za jeden den
  • Je implementováno jen málo nástrojů, není potřeba další pro 95 % standardních systémů (Příklad FYIRoporting: Kompletní bezplatné tiskové řešení)
Příklad otázky: Jak řešíte aktualizaci systému? -    
Odpověď: Snadno podle čísla verze v názvu souboru    
    
PROČ:    
Protože jsou změny implementovány v logické struktuře AUTO    
nebo Pokud ne, bude nutné změnit na AUTO Logika = Poslední ruční přepisování    
Každá každá logika selhala. Toto je skutečný problém 95 % existujících systémů    
    

Implementované bezplatné nepoužívané nástroje jsou nejlepším řešením Často se nepoužívá více světových zdrojů

  • Výsledkem jsou implementované nástroje v obou řešeních
  • SNADNÉ DATOVÉ CENTRUM – Více než 100 bezplatných technologií pro vyřešení JAKÉKOLI situace a nepotřebujete další existující levná řešení
  • EASY SYSTEM BUILDER – z implementovaných 50 balíčků se používá pouze 10 s několika částmi možností

Zde je testament: EASYTools 3rd Free Addons


Podmínka API pro ignorování v Swagger Docs

    
[ApiExplorerSettings(IgnoreApi = true)]    
    

Popis API pro popis v Swagger Docs

    
[SwaggerTag("Šablona API s INSERT/UPDATE/DELETE/SELECT AND FILTERING API")]    
public class TemplateListApi : ControllerBase {    
    
[SwaggerOperation(Summary = "Get All records", Description = "Async standard select record API", OperationId = "Select all records", Tags = new[] { "TemplateListApi" })]    
public async Task<string> GetTemplateList() {    
    
[HttpDelete("/TemplateList/{id}")]    
[Consumes("application/json")]    
[SwaggerOperation(Summary = "Delete Record", Description = "Async standard Delete Record API", OperationId = "Delete Record", Tags = new[] { "TemplateListApi" })]    
public async Task<string> DeleteTemplateList(string id) {    
    

Šablona položky MarkDown

    

Úvod EIC - Dokumentace Projektu

EasyITcenter Universální řešení serverů IT světa v 1 Globálním Balíčku Modulární Server s možností neomezeného a přesto extermně jednoduchého vývoje všemi směry Ideální Centrální Správa sítí, strojů, IT a všeho co si dovedete prtředstavit. Máte Otázky? neváhejte nám zavolat All API Types Descrtiption

Server Static API pro moduly, správu a ovládání

Server má několik statických API používaných funkcí, správa implementované moduly, role, řízení.

Zde je seznam statických API vyloučených v dokumentaci Auto API

[GET] /ServerRestart - Admin Restart Server
[GET] /AdminApiDocs - Dokumentace automatického rozhraní API
[WS] /WS/ServerCoreMonitor - Server Core Socket Monitor
[GET] /ServerDbDgmlSchema - Auto DB Schema Diagram
[GET] /ServerHealthService - Monitor stavu serveru
[GET] /Docs - Serverová statická dokumentace MD
[GET] /Docs - Serverová statická dokumentace MD
[GET] / - Centrální webový portál serveru
[GET]/Downoads – Stahování ke stažení na serveru


Zde je seznam statických API zahrnutých v dokumentaci Auto API Strukturu rozhraní API naleznete v dokumentaci Auto API

[GET,POST] /ServerEmailer - Server Maas Emailing


Úvod EIC - Dokumentace Projektu

EasyITcenter Universální řešení serverů IT světa v 1 Globálním Balíčku Modulární Server s možností neomezeného a přesto extermně jednoduchého vývoje všemi směry Ideální Centrální Správa sítí, strojů, IT a všeho co si dovedete prtředstavit. Máte Otázky? neváhejte nám zavolat Zde je Výčet Konfigurace serveru a popis co dané volby Dělají a znamenají. Když si je namalujete do pavouka zjistíte že to výkrývá téměř celé IT.

Základní Konfigurace Serveru,

Zde je Aktuální základní konfigurace serveru.Jsou do ní vytažené jen ty nejstěžejnější
nastavení, protože k dispozici sich je stonásobně víckrát. To Vyplývá z počtu přes 100 nasazených technologií v 1 řešení parfekně vyladěných pro dokonalou práci.


Config

ConfigTimeTokenValidationEnabled

  • Enable Disable Bearer Token Timeout Validation Token can be valid EveryTime to using:

    Example for machine connection Or is Control last activity

ConfigApiTokenTimeoutMin

  • Bearer Token Timeout Setting in Minutes. Connection must be Refreshed in Interval After

    Timeout connection Must Login Again. It is as needed. You Can Change Key for close All

    connections Immediately. Timeout is good for Webpages

    Recomended: 15

ConfigServerStartupOnHttps

  • Setting for Server URL Services. Logically can run only one Http or Https Server has

    more Security Setting Politics.

    Recommended: true

ConfigCertificateDomain

  • Its Domain for include to Automatic Generated Certificate For Server running on HTTPS.

    Domain is for Your validation Certificate Domain. Can be Changed for commercial.

    Domain is Used for Lets Encrypt also

    Write with Comma separator

    Recommended: 127.0.0.1

ConfigCertificatePassword

  • Password will be inserted to Server Generated Certificate for HTTPS.

    Recommended: empty = Maximal Security Randomly generated 20 chars string

ConfigServerStartupHttpPort

  • Set Server Startup HTTP Port on Http/HttpS/WebSocket and for All Engines, Modules, API

    Controler and WebPages

    Recommended: 5000

ConfigJwtLocalKey

  • Special Functions:Server AutoGenerated encryption Key For Securing Communication On Each

    Server Restart All Tokens not will be valid and the Login Reconnect is Requested. Its

    AntiHacker Security Rule

    Recommended: empty = Maximal Security Randomly generated 40 chars string

ConfigCoreServerRegisteredName

  • Server Service Name automatic figured in All IS/OS/Engines info

    Recommended: EASY-IT-CENTER

ConfigServerGetLetsEncrypt

  • Setting for Automatic Obtain Lets Encrypt

    more Security Setting Politics.

    Recommended: true

ConfigCertificatePath

  • Certificate file NextFrom'DATA'Path\Filename.pfx For import External Certificate

    Its Path from Data Startup Folder,example "groupware.pfx" is in Data Path

    The Password must be inserted in ConfigCertificatePassword Settings

    Other for ignore this Setting set empty string ""

    This settings has Higest Priority before LesEncrypt enabled

ConfigLogWarnPlusToDbEnabled

  • Enable Logging Server Warn and Errors To Database

ConfigManagerEmailAddress

  • Emailová adresa do obchodních kontaktů

ConfigServerStartupHTTPAndHTTPS

  • Startup Server On HTTP and HTTPS on Defined Port /// Aktivuje Provoz na protokolech HTTP i HTTPS současně, /// pro definici HTTP jej nastavte na zapnuto a dále dle nastaveni pro HTTPS

ConfigServerStartupHttpsPort

  • Set Server Startup HTTPS Port on Http/HttpS/WebSocket and for All Engines, Modules, API

    Controler and WebPages

    Recommended: 5001


Database

DatabaseInternalCachingEnabled

  • Enable Disable Entity Framework Internal Cache I recommend turning it off : from Logic,

    Duplicit Functionality with Database Server in complex process can generate problems

    Recommended: false

DatabaseInternalCacheTimeoutMin

  • Time in Minutes for Database Valid Cache Data and Refreshing Duplicit Functionality with

    Database Server

    Recommended: 30


Emailer

EmailerSMTPSslIsEnabled

  • EmailerSMTPSslIsEnabled SSl Email Protocol for Login to External Mail Server Its

    Necessary for Correct running Server Internal Core Monitoring

EmailerServiceEmailAddress

  • Service email, for info about not available service from HeatchCheck Can be used for

    next Develop, automatic checking problems, missing data and all other Its Necessary for

    Correct running Server Internal Core Monitoring

EmailerSMTPServerAddress

  • SMTP Server Address for Login to External Mail Server Its Necessary for Correct running

    Server Internal Core Monitoring

EmailerSMTPPort

  • SMTP Port for Login to External Mail Server Its Necessary for Correct running Server

    Internal Core Monitoring

EmailerSMTPLoginUsername

  • SMTP UserName for Login to External Mail Server Its Necessary for Correct running Server

    Internal Core Monitoring

EmailerSMTPLoginPassword

  • SMTP Password for Login to External Mail Server Its Necessary for Correct running Server

    Internal Core Monitoring


Module

ModuleSwaggerApiDocEnabled

  • Special Function: Server Automatically Generate Full Documentation of API structure AND

    Database Model. Plus Included API Interface for Online Testing All API Methods with

    Authentication Its Automatic Solution for Third Party cooperation. All changes are

    Reflected after restart server

ModuleWebDataManagerEnabled

  • Module: AutoGenerated Database DataManager for working with Data Running only

    in Debug mode for simple Develop, can be modified. All changes are Reflected after

    restart server

ModuleHealthServiceEnabled

  • Special Function: More than 200 Server Statuses Can be monitored by HeathCheckService,

    Over Net can Control Other Company Services Also as Central Control Point With Email

    Service. For Example: Server/Memory/All DB Types/IP/HDD/Port/Api/NET/Cloud/Environment

    Must be run for Metrics AddOn https://learn.microsoft.com/en-us/dotnet/architecture/microservices/implement-resilient-applications/monitor-app-health

ModuleHealthServiceRefreshIntervalSec

  • Special Function: More than 200 Server Statuses Can be monitored by HeathCheckService,

    Over Net can Control Other Company Services Also as Central Control Point With Email

    Service. For Example: Server/Memory/All DB Types/IP/HDD/Port/Api/NET/Cloud/Environment

    Must be run for Metrics AddOn !!! run in Release mode for Good Reading of Logs without

    HeathChecks Cycling info https://github.com/Xabaril/AspNetCore.Diagnostics.HealthChecks https://testfully.io/blog/api-health-check-monitoring/

ModuleMdDocumentationEnabled

  • Enable Server Structure Documentation for Developers Using RootPath, - Block File

    Browsing Is Good for Server with Documentation only Or Use for Show WebPage and Copy

    "Only HTML"

ModuleDbDiagramGeneratorEnabled

  • Enable Automatic Database Diagram for Simple show Database structure with All bingings

EnableAutoShowStaticMdAsHtml

  • Zapíná Vypína Automatické zobrazení MD souboru ve Statickém úložišti jako HTML s URL bez ".md"

EnableCodeBrowser

  • Zapíná/Vypína Modul Procházení Kódů Projektů Online

ModuleDBEntitySchemaEnabled

  • Modul Zobrazení DB Entitity Schema

ModuleDBEntitySchemaPath

  • Cestana které se Schema Zobrazí, default: /DBEntitySchema

ModuleCSharpCodeBuilder

  • Zapnout Online Správu Projektu Serveru a vývoj

ModuleHealthServicePath

  • Api URL cesta Serveru na které

    bude Dohledové centrum k dispozici

ModuleSwaggerApiDocPath

  • Api URL cesta Serveru na které

    bude API Dokumentace a Testovací rozhraní k dispozici

ModuleHealthServiceMessageOnChangeOnly

  • Zaznamenávat Logování/zaslání zprávy pouze při změně z OK->FAIL, jinak bude zaznamenáno v každém cyklu

Server

ServerProviderModeEnabled

  • Enabling Provider APIs

    More Informations are Published on WepPages

    Are Published Core Informations With

    Full Solutions Info/Tools/Codes/Etc Published

ServerCorsEnabled

  • Server Filtrování Dle CORS Zapnuto

ServerCorsAllowAnyMethod

  • CORS Hlavičky HTTP Requestů příchozích na server WEB + API ,Povolit jakoukoliv Metodu

ServerCorsAllowAnyHeader

  • CORS Hlavičky HTTP Requestů příchozích na server WEB + API ,Povolit jakýkoliv Header

ServerCorsAllowCredentials

  • CORS Hlavičky HTTP Requestů příchozích na server WEB + API ,Povolit jakékoliv Pověření - Autorizaci

ServerCorsAllowAnyOrigin

  • CORS Hlavičky HTTP Requestů příchozích

    na server WEB + API,

    Povolit jakýkoli původ

ServerPublicUrl

  • Veřejná URL adresa serveru použita v modulech

BrowserLinkEnabled

  • Okamžitý Rerresh při vytvoření změn na Webu, Pomůcka vývoje, Pozor muze delat problemy Je jednoduchy neni staveny na robustni systemy

DefaultStaticWebFilesFolder

  • Root Složka pro Statické soubory Webu

Services

ServiceServerLanguage

  • Server Language for Translating Server internal statuses

    Recommended: cz or en - other languages are not implemented

ServiceEnableMassEmail

  • Zapíná/Vypína API pro Hromadné odesílání Emailů. Krásná Ukázka jak API může být Rozsáhlá serverová služba.

ServiceUseDbLocalAutoupdatedDials

  • Special Function: Using Selected Tables with AutoRefresh On change as Local DataSets,

    For Optimize Traffic. For Example LanguageList - Static table with often reading

    Recommended: true - functionality must be implemented in Server Code

ServiceCoreCheckerEmailSenderActive

  • Activation / Deactivation of Email Sender For Server Core Fails Checker All Catch Write

    to SendEmail, In Debug mode is Written in console in Release mode is Sended email (All

    incorrect server statuses are monitored) Can be writen to Database - !!! Warning for

    infinite Cycling (DB shutdown example)

    Recommended: true


SubServers

ServerFtpSecurityEnabled

  • Zapíná/Vypíná Poninost Přihlašování. Vypnuto = 1 úložiště cotevřené pro R/W anonymní přístup. Zapnuto znamená že každý uživatel má svoji složku a je povinost přihlášení.

ModuleAutoSchedulerEnabled

  • Server Scheduler Module for Automatization Tasks

    The serve scheduler enabled.

    **ServerFtpEngineEnabled**
  • Enable FTP File Server oppened for every connection with full rights

ServerDocsOldAutoRemoveEnabled

  • Zapíná/Vypíná Automatické Odebírání Starých Verzí Dokumentace. Vztahuje se k Názvu, v Případě Změny Názvu je nutné Starou Verzi Odebrat manuálně

GitServerEnabled

  • Zapíná Vypíná privátní Git Server

Web

RedirectOnPageNotFound

  • Aktivuje Presmerovani na Zadanou cestu v případě Stránka nenalezena

RedirectPath

  • Cesta na kterou se přesměruje Webová Stránka v případě 404 stránka nenalezena. Je také nastavena jako Výchozí Stránka

WebRazorPagesCompileOnRuntime

  • Provádí kompilaci Za běhu Serveru. Tzn.. Podporuje Vkládání Stránek Externě

WebSitemapFileEnabled

  • Generovaný Soubor Sitemap z Menu Portálu

WebRobotTxtFileEnabled

  • zapnout zobrazení souboru Robot.txt , obsah se bere z nastavení Portálu

WebRSSFeedsEnabled

  • Zapnout Generování RSS fédů; z položek, novinek

WebBrowserContentEnabled

  • Enable WebPages File Browsing from server Url on Server

WebRazorPagesEngineEnabled

  • Enable Razor WebPages support engine with Correct Configuration for Automaping from

    folder 'ServerCorePages'

WebMvcPagesEngineEnabled

  • Enable Mvc WebPages support engine with Correct Configuration

WebLiveDataMonitorEnabled

  • Enable Server Static Folder Monitor for Data Changes

    And immediatelly update all Api, Endpoints, Client Browser


WebSocket

WebSocketGlobalNotifyPath

  • WebPortal Global Notify Path on WebSocket for

    sending messages from scheduler

    The web global socket notify path.

    **WebSocketServerMonitorEnabled**
  • Server support online multi watch Logging

    Its Run on Websocket and the Log Messages are

    sent for All opened connections for wathing

    on Path: ServerCoreMonitor

    You can enable Mass Email Api

WebSocketEngineEnabled

  • Enable WebSocket Engine with Default Example Api Controller

WebSocketTimeoutMin

  • WebSocket Timeout Connection Settings in Minutes. After timeout when not detected any

    communication socket is closed Set according to your need

    Recommended: 2

WebSocketMaxBufferSizeKb

  • Určuje Maximální velikost WebSocket zprávy

Úvod EIC - Dokumentace Projektu

EasyITcenter Universální řešení serverů IT světa v 1 Globálním Balíčku Modulární Server s možností neomezeného a přesto extermně jednoduchého vývoje všemi směry Ideální Centrální Správa sítí, strojů, IT a všeho co si dovedete prtředstavit. Máte Otázky? neváhejte nám zavolat Do serveru lze zaimplementovat téměř neomezeně funkcionalit. Sám jich už má přehršel. Je tu ale nová Dynamická agenda kde se nastavují přístupy k zaimplementovaným modulům, nebo je možné tvořit vlastní webové moduly jako jednostánkové weby pro určitý Účel. ke snadnosti slouží knihovny kódů pomocí kterých tyto moduly můžete doslova Generovat

Seznam Implementovaných Modulů Serveru,

Do serveru lze zaimplementovat téměř neomezeně funkcionalit. Sám jich už má přehršel. Je tu ale nová Dynamická agenda kde se nastavují přístupy k zaimplementovaným modulům, nebo je možné tvořit vlastní webové moduly jako jednostánkové weby pro určitý Účel. ke snadnosti slouží knihovny kódů pomocí kterých tyto moduly můžete doslova Generovat


FullHtmlPage

GlobalLogin

Html/JS Modul Sloužící k ověření přihlášení a zápisu tokenu. JTímto způsobem se jedná o globální použití a může být použit pro každý nástoje, systém z jediného místa, takto si můžete postavit další systém, stvořený pouze z funkčních částí Je určen pro použití pro Stránky vyžadující Autorizaci Na základě přesměrování automaticky přesměruje na Login a Zpět

404NonExistPage

*Stránka, která se zobrazí při pokusu o otevření neexistující stránky !!! JE SYSTÉMOVÁ NEMĚNIT NÁZEV!!! Do Url a Funkce ve Scriptu zadejte Kam ná být dotyčný přesměrován Výchozí je: /ServerControls/404NonExistPage - API Systému směrující na název: 404NonExistPage a UrlSubPath: /DefaultWebPages/404NonExistPage *

401UnauthorizedPage

Stránka, která se zobrazí při neautorizovaném pokusu o otevření Autorizovaných stránek beuz vlastního přesměrování !!! JE SYSTÉMOVÁ NEMĚNIT NÁZEV!!! Do Url a Funkce ve Scriptu zadejte Kam ná být dotyčný přesměrován Výchozí je: /ServerControls/401UnauthorizedPage - API Systému směrující na název: 401UnauthorizedPage a UrlSubPath: /DefaultWebPages/401UnauthorizedPage


HtmlBodyOnly

DeveloperNews

*Modul Automaticky překládaná Stránka Novinek Pro Samostatné Zobrazení